我正在使用 OCMock进行单元测试。
我有一个单例类MyManager
:
@implementation MyManager
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
// This is the function I want to stub in my test case
- (NSInteger) getId{
return [self askBackendToReturn];
}
...
@end
在我的测试用例中,我想对 -(NSInteger) getId:
的返回进行 stub 。我厌倦了以下内容:
id mgrMock = OCMClassMock([MyManager class]);
// read OCMock 3 document, seems the return from OCMClassMock can be either a mocked class or mocked instance. The following line of code is according to its documents "Stubbing methods that create objects" http://ocmock.org/reference/#advanced-topics
OCMStub([[mgrMock alloc] init]).andReturn(mgrMock);
// Now I stub the function to return 1
OCMStub([mgrMock getId]).andReturn(1);
// test it, I still get the real id from backend, WHY?
MyManager *sharedManager = [MyManager sharedManager];
NSInteger mgrId = [sharedManager getId];
但是当我运行时,stub return 不起作用,它仍然返回真实的 id。为什么?
最佳答案
它返回真实 ID 的原因是因为一次 [self alloc]
在您的实现中调用,您正在处理 MyManager
的新实例.这意味着在 [[self alloc] init]
你最终调用init
在一个不知道 stub 方法的全新实例上。
如果您想采用对 MyManager
进行 stub 的方法初始化,你必须同时 stub [mgrMock alloc]
和 [mgrMock init]
返回你的模拟对象。
本着单元测试的精神,我的建议是完全取消这种方法,而只是简单地 stub sharedManager
返回mgrMock
.您的测试与单例的 Id 相关,并且应该假定初始化按预期进行。
关于ios - stub 方法返回在单元测试中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37440982/