gpt4 book ai didi

objective-c - iOS - 单元测试异步代码

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:25 27 4
gpt4 key购买 nike

我尝试测试的方法部分如下:

- (void)configureTableFooterView {
dispatch_async(dispatch_get_main_queue(), ^{
self.tableView.tableFooterView = nil;

if ([self.parser.resultSet isLastPage]) {
return;
}
});
}

我写的单元测试如下:

- (void)testTableFooterViewConfigurationAfterLastPageLoaded {

id mockTableView = OCMClassMock([GMGFlatTableView class]);

OCMExpect([mockTableView setTableFooterView:[OCMArg isNil]]);

id resultSet = OCMClassMock([GMGResultSetInfo class]);

OCMStub([resultSet isLastPage]).andReturn(YES);

OCMStub([self.mockParser resultSet]).andReturn(resultSet);

id partialMockSUT = OCMPartialMock(self.sut);

OCMStub([partialMockSUT tableView]).andReturn(mockTableView);

[self.sut configureTableFooterView];

OCMVerifyAllWithDelay(mockTableView, 2.0);

//OCMVerifyAllWithDelay(partialMockSUT, 2.0);
}

我在同一个类中有另一个测试,它在主线程上的 dispatch_async 调用中测试相同的东西。该测试中的测试期望和验证设置与此匹配。虽然该测试通过了,但这个测试在延迟的验证步骤中陷入了无限循环。

有趣的是,如果我只运行这 1 个测试,它会毫无问题地通过。仅当此测试与其他测试一起运行时我才发现问题。

更新:

In unit test, execute the block passed in queue with dispatch_asyc

这是一个更相关的帖子。然而,这几乎以与原始测试方法完全相同的方式失败:

- (void)testTableFooterViewConfigurationAfterLastPageLoaded {

id mockTableView = OCMClassMock([GMGFlatTableView class]);

OCMExpect([mockTableView setTableFooterView:[OCMArg isNil]]);

id resultSet = OCMClassMock([GMGResultSetInfo class]);

OCMStub([resultSet isLastPage]).andReturn(YES);

OCMStub([self.mockParser resultSet]).andReturn(resultSet);

id partialMockSUT = OCMPartialMock(self.sut);

OCMStub([partialMockSUT tableView]).andReturn(mockTableView);

[self.sut configureTableFooterView];

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];

OCMVerifyAll(mockTableView);
}

作为套件运行时,带有 NSRunLoop 的代码行因 EXC_BAD_ACCESS 而崩溃,但单独运行时运行良好!

最佳答案

您可以围绕 dispatch_async 进行类包装,并将其作为依赖项传递。你也可以制作假的包装器,并在测试中通过它。如果你有兴趣,我可以提供更详细的解释。

关于objective-c - iOS - 单元测试异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com