ios - stub 方法返回在单元测试中不起作用

标签 ios objective-c unit-testing ocmock

我正在使用 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/

相关文章:

ios - 保持 uiview 突出显示(更改它的 alpha)直到另一个被点击

c# - 如何测试与 ModelState 一起使用的 ActionFilterAttribute?

ios - 如何禁用 UIButton 3 秒?

ios - 我将如何开始复制 Apple 在 iOS 7 中作为默认设置使用的自定义 View Controller 转换?

ios - 6 个不同的 UISwipeGestureRecognizer,总是收到相同的

java - 在使用 @InjectMocks 注入(inject)之前初始化模拟对象内部

android - 如何对蓝牙配件进行单元测试?

ios - 如果 .srt 文件包含多行字幕文本,如何在 swift 中使用 Scanner 解析它?

ios - 通过保存 html 页面使加载 UIWebView 更快

iPhone 4 显卡