Objective-C object factory for testing.
- Define factories once, build everywhere.
- Named factories.
- Sequences.
- Associations.
- Handle primitives
- Factory inheritance.
- Tested.
As a CocoaPod Just add this to your Podfile
pod 'Defactory'
- You should be able to add Defactory to you source tree. If you are using git, consider using a
git submodule
Given the following User class
LSUser
@interface LSUser : NSObject
@property (nonatomic, strong) NSString *username;
@property (nonatomic, strong) NSString *password;
@property (nonatomic, strong) NSString *state;
@property (nonatomic, assign) NSUInteger loginCount;
@property (nonatomic, assign) BOOL somethingBool;
@property (nonatomic, strong) NSString *email;
@property (nonatomic, strong) LSUser *dad;
@end
@implementation LSUser
@end
FACTORIES(^{
// Default factory
[LSUser defineFactory:^(LSFactory *f) {
f[@"username"] = @"foo"; // Set values.
f[@"password"] = @"hunter2";
// Define sequences.
f[@"email"] = sequence(^(NSUInteger i) { return [NSString stringWithFormat:@"foo%d@example.com", i]; });
}];
// Other named factories with inheritance.
[LSUser define:@"suspended" parent:@"LSUser" factory:^(LSFactory *f) {
f[@"state"] = @"suspended";
// User boxed primitives, Defactory will take care of the rest.
f[@"loginCount"] = @2;
f[@"somethingBool"] = @YES;
}];
[LSUser define:@"son" parent:@"LSUser" factory:^(LSFactory *f) {
// Associations.
f[@"dad"] = association([LSUser class]);
}];
});
// Build an object with the default factory and params
LSUser *user = [LSUser build];
// Build an object with the default factory overriding some params.
user = [LSUser buildWithParams:@{@"password": @"secret", @"state": @"active"}];
// Build an object with a named factory.
user = [LSUser build:@"suspended"];
// Build an object with a named factory overriding some params.
user = [LSUser build:@"suspended" params:@{@"loginCount": @4}];
- Fork it
- Create your feature branch
- Commit your changes
- Push to the branch
- Create new Pull Request