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

Ben*_*nie 5 xcode unit-testing asynchronous objective-c ocmock

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

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

id mock = OCMClassMock([SomeClass class]);
OCMExpect([mock methodThatShouoldExecute]);
OCMVerifyAllWithDelay(mock, 1);
Run Code Online (Sandbox Code Playgroud)

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

VerifyNotCalled([mock methodThatShouoldExecute]);
OCMVerifyAllWithDelay(mock, 1);
Run Code Online (Sandbox Code Playgroud)

Dav*_*ave 3

我建议使用 anOCMStrictClassMock而不是 the OCMClassMock(这会给你一个很好的模拟)。如果调用了您未存根或未预期的任何方法,严格模拟将立即使您的测试失败,这使您的测试更加严格。

如果这不适合您,您可以执行您所描述的操作:

OCMReject([mock methodThatShouoldExecute]);
Run Code Online (Sandbox Code Playgroud)

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

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

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

[self waitForExpectationsWithTimeout:1 handler:nil]
Run Code Online (Sandbox Code Playgroud)