我正在使用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将在其他测试中保存类似代码的行.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。