gpt4 book ai didi

ios - 一些涉及 block 方法和 OCMockito 的验证

转载 作者:可可西里 更新时间:2023-11-01 03:43:26 27 4
gpt4 key购买 nike

我正在使用 OCMockito,我想在我的 ViewController 中测试一个使用 NetworkFetcher 对象和 block 的方法:

- (void)reloadTableViewContents
{
[self.networkFetcher fetchInfo:^(NSArray *result, BOOL success) {
if (success) {
self.model = result;
[self.tableView reloadData];
}
}];
}

特别是,我想模拟 fetchInfo: 以便它返回一个虚拟的 result 数组而不访问网络,并验证 reloadData 方法在 UITableView 上被调用,模型是它应该的样子。

由于这段代码是异步的,我假设我应该以某种方式捕获该 block 并从我的测试中手动调用它。

我怎样才能做到这一点?

最佳答案

这很简单:

- (void) testDataWasReloadAfterInfoFetched 
{
NetworkFetcher mockedFetcher = mock([NetowrkFetcher class]);
sut.networkFetcher = mockedFetcher;

UITableView mockedTable = mock([UITableView class]);
sut.tableView = mockedTable;

[sut reloadTableViewContents];

MKTArgumentCaptor captor = [MKTArgumentCaptor new];
[verify(mockedFetcher) fetchInfo:[captor capture]];

void (^callback)(NSArray*, BOOL success) = [captor value];

NSArray* result = [NSArray new];
callback(result, YES);

assertThat(sut.model, equalTo(result));
[verify(mockedTable) reloadData];
}

我将所有内容都放在一个测试方法中,但是将 mockedFetchermockedTable 的创建移动到 setUp 将为您节省其他测试中的类似代码行.

关于ios - 一些涉及 block 方法和 OCMockito 的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23860341/

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