FactoryBird 是一个 Objective-C 库,可以轻松创建一组用于 Objective-C 单元测试的假模型固定装置。它允许您轻松配置并创建具有假数据的对象,您可以在测试中使用这些对象以实现隔离的已知状态。
这是因为 Objective-C 的 FactoryBird 是基于 Ruby 的 factory_girl 功能构建的。
它主要受 Foundry 的启发,但它增加了一些额外的 灵活性。
build
创建默认测试对象,或者通过传递一个字典作为属性并在其中提供默认属性的山姆,调用 buildUsing:
。FactoryBirdObject
协议时,您可以使用喜欢的任何 faker pod。我在使用 Gizou。♥ CocoaPods.
pod 'FactoryBird', '~> 0.0.1'
将 FactoryBird 添加到您的测试目标中,以及所有您想使用它的目标。例如 单元测试和快照测试。
清洁提示:在测试目标的文件夹同一级别下创建一个单独的 Factories/
文件夹,该文件夹将保存对象工厂。
Tests/
Factories/
UnitTests/
SnapshotTests/
如果使用 Core Data,将 NSManagedObject 与常规 NSObject 分开是一个好主意。
Tests/
Factories/
CoreData/
Ponsos/
UnitTests/
SnapshotTests/
定义对象的工厂只是使其类符合 <FactoryBirdObject>
协议。
#import "FactoryBird.h"
@interface Task <FactoryBirdObject>
只有一个方法要实现
+ (NSDictionary *)factoryAttributes
在这里,您创建一个假对象所需的属性键-值对字典。
+ (NSDictionary *)factoryAttributes
{
return @{ @"title" : @"Title for testing",
@"dueOn" : [NSDate dateWithTimeIntervalSince1970:1425314661],
@"resolved" : @NO,
@"taskID" : @1,
@"description": @"Lorem ipsum dolor est"
};
}
键可以是类或其超类中的任何 属性
。在 NSManagedObject 的情况下,属性
和 关系
(因为它们是 属性
)。
当您需要一个模型的工厂时,您可以让模型类直接遵从 <FactoryBirdObject>
协议。
但是,您也可以不改变类,在 Factories/
文件夹内为测试目标/s 添加一个新的类别。这样,您可以保持您的模型代码整洁,并且工厂方法只能在真正的测试目标内部使用 。
Tests/
Factories/
Task+FactoryBird.h
Task+FactoryBird.m
UnitTests/
SnapshotTests/
Task+FactoryBird.h
头文件
#import "FactoryBird.h"
@interface Task (FactoryBird) <FactoryBirdObject>
@end
创建工厂后,在测试中使用它非常简单。
Task *task = [Task build];
Task *resolvedTask = [Task buildUsing:@{@"resolved":@YES}];
您传递的字典将根据工厂是否定义或重写这些属性,将属性添加到 Task
对象中。
NSArray *tasks = [Task buildTimes:@20];
NSArray *tasksWithProjects = [Task buildTimes:@20 using:^NSDictionary *(NSUInteger idx) {
return @{@"project": [Project build]};
}];
User *user = [User buildWithContext:context];
User *maria = [User buildWithContext:context using:@{@"name":@"Maria"}];