我正在使用Ocmockito,我想在我的ViewController中测试一个使用NetworkFetcher对象和块的方法:
- (void)reloadTableViewContents
{
[self.networkFetcher fetchInfo:^(NSArray *result,BOOL success) {
if (success) {
self.model = result;
[self.tableView reloadData];
}
}];
}
特别是,我想模拟fetchInfo:这样它就会返回一个虚拟结果数组,而不会访问网络,并验证是否在UITableView上调用了reloadData方法,模型应该是它应该是什么.
由于此代码是异步的,我假设我应该以某种方式捕获块并从我的测试中手动调用它.
我怎么能做到这一点?
解决方法
这很容易:
- (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];
}
我把所有东西放在一个测试方法中,但是将mockedFetcher和mockedTable的创建移动到setUp将在其他测试中保存类似代码的行.