在我的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
中执行此操作,因此它会在每次测试后自动发生。或者,您可以create a category in your unit tests that overrides
sharedInstance
to return a mock object。