我正在使用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将在其他测试中保存类似代码的行.