在我的XCode项目中,我有:

  • 控制器
  • (Singleton)数据库控制器

  • 在控制器类中实例化了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

    10-05 23:58