如何使用 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]
我想验证 未 调用函数。该函数在测试函数内部的异步块调用中执行,因此 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]