objective-c - 如何使用 OCMock 验证异步方法未在 Objective C 中调用?

标签 objective-c xcode unit-testing asynchronous ocmock

我想验证函数是否被调用。该函数在测试函数内部的异步 block 调用中执行,因此 OCMReject() 不起作用。

我测试异步函数是否确实被调用的方法如下:

id mock = OCMClassMock([SomeClass class]);
OCMExpect([mock methodThatShouoldExecute]);
OCMVerifyAllWithDelay(mock, 1);

如何进行测试以测试是否未调用禁止的函数? 像这样的东西:

VerifyNotCalled([mock methodThatShouoldExecute]);
OCMVerifyAllWithDelay(mock, 1);

最佳答案

我建议使用 OCMStrictClassMock 而不是 OCMClassMock(它给你一个很好的模拟)。如果调用任何您没有 stub 或期望的方法,严格模拟将立即使您的测试失败,这使您的测试更加严格。

如果这不是您的选择,您可以执行您描述的操作:

OCMReject([mock methodThatShouoldExecute]);

请参阅 OCMock docs 中的“常规(良好)模拟的快速失败”部分.

现在至于等待您的代码可能调用禁止的方法,那是另一回事。您不能使用 OCMVerifyAllWithDelay,因为它会在满足所有预期后立即返回,它不会等待整整一秒来查看是否会对它进行非法调用。一种选择是在每次验证模拟之前等待 1 秒。理想情况下,您还可以使用 XCTestExpectation 显式等待您的异步任务。 .像这样的东西:

XCTestExpectation *asyncTaskCompleted = [self expectationWithDescription:@"asyncTask"];
// Enqueued, in an onCompletion block, or whatever call 
//  ... [asyncTaskCompleted fulfill]

[self waitForExpectationsWithTimeout:1 handler:nil]

关于objective-c - 如何使用 OCMock 验证异步方法未在 Objective C 中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48780467/

相关文章:

xcode - 如何从 Phonegap/Cordova 项目中删除默认本地化?

ios - 在一台设备上绘图以在另一台设备上可见

ios - Interface Builder 网点管理

python - Argparse 单元测试 : Suppress the help message

iOS - 修复 cellForItemAtIndexPath 图像加载问题

objective-c - 在 iOS 5 ARC 中移除一个 NSNotificationCenter 观察者

ios - 在 View 之间传递数据?

C# 重复公共(public)代码的单元测试

c# - 使用属性 CharacterSet 的值模拟 HttpWebResponse

iphone - 核心数据; cocoa 错误 134100