如何使用OCMock验证在Objective C中不调用异步方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用OCMock验证在Objective C中不调用异步方法?相关的知识,希望对你有一定的参考价值。

我想验证没有调用函数。该函数在被测函数内的异步块调用中执行,因此OCMReject()不起作用。

我测试过异步函数确实被调用的方式如下:

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

如何进行测试以测试是否未调用禁用函数?就像是:

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

我建议使用OCMStrictClassMock而不是OCMClassMock(这给你一个很好的模拟)。如果调用了任何你没有存根或期望的方法,那么严格的模拟会立即使你的测试失败,这会使你的测试变得更加严格。

如果这不是你的选择,你可以做你所描述的:

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]

以上是关于如何使用OCMock验证在Objective C中不调用异步方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OCMock 验证静态方法

如何使用 ocmock 验证部分模拟是不是具有使用 args 调用的基本方法?

如何使用 OCMock 3 在单元测试中检查函数的返回值

如何使用 ocmock 在基于类的方法上存根返回值

使用 OCMock 检查 IBOutlet 连接

OCMock - 验证方法调用的顺序。还有其他方法吗?