ios - OCMock 在被测代码中自动使用模拟实例?

标签 ios objective-c unit-testing ocmock

我是新来的 OCMock .

我使用 dispatch_once() 创建了一个单例类 MyManager :

@implementation MyManager

+ (id)sharedInstance {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}

我在 School 类中有一个使用上述单例的方法:

@implementation School
...
- (void) createLecture {
  MyManager *mgr = [MyManager sharedInstance];
  [mgr checkLectures];
  ...
}
@end

现在,我想对这个方法进行单元测试,我使用了 MyManager 的部分模拟:

- (void) testCreateLecture {
  // create a partially mocked instance of MyManager
  id partialMockMgr = [OCMockObject partialMockForObject:[MyManager sharedInstance]];

  // run method to test
  [schoolToTest createLecture];
  ...
}

我注意到使用 OCMock,在我创建了我的单例 MyManager 实例的部分模拟之后,当运行我的测试方法时,它自动使用部分模拟的实例。

这对我来说有点奇怪,因为在我上面的测试用例中,我只创建了 MyManager 实例的部分模拟,而没有将它注入(inject)到 MyManager 类中,

当被测代码调用[MyManager sharedInstance]时,OCMock如何自动强制被测代码使用这个mocked实例?有人可以给我解释一下吗?

最佳答案

partialMockForObject 模拟您传递给它的对象。

在这种情况下,您正在模拟单例(共享)对象。您不必注入(inject)任何东西,因为 sharedInstance 总是返回同一个对象,现在被模拟了。它仍然是相同的引用。

将部分模拟想象成传递对象的简单突变,它不会创建新实例,因此您不必在这种特定情况下注入(inject)它。

关于ios - OCMock 在被测代码中自动使用模拟实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549536/

相关文章:

iOS 15 SwiftUI TabView 标签栏外观不会在 View 之间更新

objective-c - 从 c 函数访问 objective-c 变量

iphone - 绘画应用中的 UISwipeGestureRecognizer

ios - UIDocumentInteractionController 禁止在某些应用程序中打开

ios - 利用外部加载 Nib 中的 IBOutlets/IBActions

ios - iPhone 上的慢速 CSS 过滤器?

ios - 使用 SpriteKit 创建一条直线

c - 如何手动执行单元测试?

node.js - 使用 mocha+sinon 测试 ExpressJS 路由时,如何 "stub"路由本地函数?

Django测试客户端HTTP基本身份验证以进行发布请求