gpt4 book ai didi

iOS 单元测试私有(private)模拟对象?

转载 作者:行者123 更新时间:2023-12-01 22:34:21 26 4
gpt4 key购买 nike

在我的 XCode 项目中,我有:

  • Controller
  • (单例)数据库 Controller

databaseController 在 Controller 类中实例化。

如何用模拟对象替换此数据库 Controller 以验证 Controller 类的正常功能而不依赖于实际的数据库 Controller ?

注释:
- 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 .

关于iOS 单元测试私有(private)模拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263002/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com