这个blog article说:
但这并不能解释原因。与简单的OCMockito相比,在哪些情况下DI(注入(inject)符合协议(protocol)的id
对象)将更适合在Objective-C中进行模拟:
[given([mockArray objectAtIndex:0]) willReturn:@"first"];
[verifyCount(mockArray, times(1)) objectAtIndex:];
?
最佳答案
我注意到,当原始类执行一些异步操作时,为测试目标创建一个单独的类会更容易。
假设您为UIViewController 编写了一个测试,该测试具有LoginSystem依赖关系,该依赖关系使用AFNetworking向API发出请求。 LoginSystem将块参数用作回调。 (UIViewController-> LoginSystem-> AFNetworking)。
如果您模拟LoginSystem,则可能会遇到问题,即如何触发回调块以测试成功/失败时的UIViewController行为。当我尝试以MKTArgumentCaptor结尾来检索块参数时,我不得不在测试文件中调用它。
另一方面,如果为LoginSystem创建一个单独的类(将其命名为LoginSystemStub,它从LoginSystem扩展而来),则可以在3行代码中并在测试文件外部“模拟”行为。我们还应该保持测试文件的清洁和可读性。
另一种情况是verify()不适用于检查异步行为。调用Expect(smth2)要容易得多。 将 .equal(smth)
编辑:
指向NSError(NSError **)的指针也不能与verify()一起很好地工作,最好创建一个存根:D