ios - 不使用 OCMClassMock 调用方法

标签 ios unit-testing ocmock

你好,

我正在使用 OCMock 编写单元测试,但我无法理解为什么以下测试失败。 我正在尝试从名为 MyOtherViewController 的类测试此方法:

// private method of firstViewController
- (void)goToInitialViewController
{
    // type of secondViewController is SecondViewController
    [secondViewController showInitialViewController];
}

这是我编写的测试:

- (void)testShowInitialVCCalledWhenGoToInitialVCCalled
{
    id secondVCMock = OCMClassMock([SecondViewController class]);

    FirstViewController *firstVC = [FirstViewController new];

    [firstVC goToInitialViewController];

    OCMVerify([secondVCMock showInitialViewController]);
}

我也尝试使用 OCMPartialMock([SecondViewController new]) 但测试仍然失败。 我想我错过了一些关于模拟的东西。

如有任何帮助,我们将不胜感激!谢谢

最佳答案

secondViewController 是一个实际的 SecondViewController。为了进行测试,您需要注入(inject)一个替代品。有几种不同的方法,但最干净的两种是:

  1. 构造函数注入(inject):将第二个 View Controller 传递给第一个 View Controller 的初始化器。生产代码将传入一个 SecondViewController。测试代码将传入一个模拟对象。
  2. 属性注入(inject):将 secondViewController 公开为属性。生产代码可以在呈现第一个 View Controller 之前将属性设置为 SecondViewController。测试代码可以将其设置为模拟对象。

有关更多信息,请参阅 How to Use Dependency Injection to Make Your Code Testable

关于ios - 不使用 OCMClassMock 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35574319/

相关文章:

ios - 如何在 Swift 中创建一个空数组?

iphone - 从 iOS 读取 Windows 共享文件夹

ios - 是否可以使用 OCMock 和 NSURLConnection 来注入(inject)模拟服务器响应数据?

ios - OCMock:使用调用的 NSDictionary 参数测试方法

ios - Xcode:@1x 的图像尺寸从未被使用过

iOS 应用程序 : Rejected in AppStore to external testers

javascript - 我应该对我的/src 文件还是/build 文件进行单元测试?

javascript - Jasmine 单元测试模拟一个 promise

.net - 将 NUnit 测试项目转换为 MS 测试

objective-c - 为类的所有实例模拟 OCMock 中的方法