3

在我的 XCode 项目中,我有:

  • 控制器
  • (单例)数据库控制器

databaseController 在控制器类中实例化。

如何用模拟对象替换此 databaseController 以验证控制器类的正常运行而不依赖于实际的 databaseController?

注意:
- OCUnit 用于单元测试。
- OCMock 用于创建 Mock 对象。

额外问题:如果 databaseController 不是单例怎么办?

4

1 回答 1

2

这是我一直采取的方法。在你的单身人士中:

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以返回模拟对象的类别。

于 2012-06-30T16:28:56.040 回答