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

How to use OCMock to verify that an asynchronous method does not get called in 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 中的 "Failing fast for regular (nice) mocks" 部分。

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

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

[self waitForExpectationsWithTimeout:1 handler:nil]