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

问题描述 投票:4回答:1

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

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

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

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

VerifyNotCalled([mock methodThatShouoldExecute]);
OCMVerifyAllWithDelay(mock, 1);
objective-c xcode unit-testing asynchronous ocmock
1个回答
2
投票

我建议使用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]
© www.soinside.com 2019 - 2024. All rights reserved.