在我的 XCode 项目中,我有:
- 控制器
- (单例)数据库控制器
databaseController 在控制器类中实例化。
如何用模拟对象替换此 databaseController 以验证控制器类的正常运行而不依赖于实际的 databaseController?
注意:
- OCUnit 用于单元测试。
- OCMock 用于创建 Mock 对象。
额外问题:如果 databaseController 不是单例怎么办?
在我的 XCode 项目中,我有:
databaseController 在控制器类中实例化。
如何用模拟对象替换此 databaseController 以验证控制器类的正常运行而不依赖于实际的 databaseController?
注意:
- OCUnit 用于单元测试。
- OCMock 用于创建 Mock 对象。
额外问题:如果 databaseController 不是单例怎么办?
这是我一直采取的方法。在你的单身人士中:
static SomeManager *_sharedInstance = nil;
+(SomeManager *)sharedInstance {
if (_sharedInstance == nil) {
_sharedInstance = [[SomeManager alloc] init];
}
return _sharedInstance;
}
+(void)setSharedInstance:(SomeManager *)instance {
_sharedInstance = instance;
}
然后,在您的测试中:
-(void)testSomethingThatUsesSingleton {
id mockManager = [OCMockObject mockForClass:[SomeManager class]];
[SomeManager setSharedInstance:mockManager];
[[mockManager expect] something];
[controller doSomething];
[mockManager verify];
[SomeManager setSharedInstance:nil];
}
不要忘记在测试结束时将单例设置回零。我通常tearDown
在我的单元测试基类中执行此操作,因此它会在每次测试后自动发生。
或者,您可以在单元测试中创建一个覆盖sharedInstance
以返回模拟对象的类别。