#[create]Expand description
Transforms a struct into a mockable version of itself.
An associated function called faux is created for the tagged
struct, masking the original definition of the struct by changing
its name.
Use cargo-expand to see the changes to your struct after macro
expansion.
§Requirements
This macro deliberately fails to compile if any of the struct’s fields are not private. Otherwise, a user of the struct could try to access the field directly when it no longer exists in the transformed version.
Only methods within impl blocks tagged by
#[methods] may use the struct’s fields.
§Examples
#[cfg_attr(test, faux::create)]
pub struct MyStruct {
a: i32,
b: Vec<u32>,
}
#[cfg_attr(test, faux::methods)]
impl MyStruct {
/* methods go here */
}
// creates a mock instance of MyStruct
let my_mock = MyStruct::faux();§Attribute arguments
§self_type
Customizes storage of real instances of the mockable struct.
If self_type is set, it must be set to the same value in all
#[methods] for this struct.
§Explanation
By default, #[faux::create] transform a struct from:
#[faux::create]
struct MyStruct { /* fields */ }into something like:
struct MyStruct(MaybeFaux);
enum MaybeFaux {
// when a mock is created we use this variant
Mock(/* snip */),
// when a real instance is created we use this variant
// stores an owned instance of the struct
// not a smart pointer to the struct
Real(OriginalMyStruct),
}
// the definition of the original struct
struct OriginalMyStruct { /* fields */ }This works well when constructors of MyStruct returns an owned
instance. There are some cases, however, where the constructor
returns a smart pointer (i.e., Rc<Self>). To support such cases,
use this attribute argument to customize how faux will wrap the
real instance of your struct.
§Examples
use std::sync::Arc;
#[faux::create(self_type = "Arc")]
pub struct MyStruct {
/* private fields */
}
#[faux::methods(self_type = "Arc")]
impl MyStruct {
pub fn new() -> Arc<Self> {
/* implementation */
}
/* more methods */
}§Allowed values:
#[create(self_type = "Owned")](default)#[create(self_type = "Rc")]#[create(self_type = "Arc")]#[create(self_type = "Box")]