Ios 在自定义isEqual实现上预期并调用isEqual时,OCMock失败
考虑以下代码Ios 在自定义isEqual实现上预期并调用isEqual时,OCMock失败,ios,ocmock,xctest,Ios,Ocmock,Xctest,考虑以下代码 OCMockObject *mock = [OCMockObject mockForClass:[NSObject class]]; [[[mock expect] andReturnValue:OCMOCK_VALUE((BOOL){YES})] isEqual:[OCMArg any]]; [mock isEqual:[NSObject new]]; [mock verify]; 有人能告诉我为什么这会失败吗 测试失败:-[NSObject_tests Testisequal
OCMockObject *mock = [OCMockObject mockForClass:[NSObject class]];
[[[mock expect] andReturnValue:OCMOCK_VALUE((BOOL){YES})] isEqual:[OCMArg any]];
[mock isEqual:[NSObject new]];
[mock verify];
有人能告诉我为什么这会失败吗
测试失败:-[NSObject_tests Testisequaliscaled]失败:
OCMockObject[NSObject]:未调用预期的方法:(null)
这毫无意义。我尝试使用
andReturn:
而不是andReturnValue:
,但仍然没有结果。expect
返回OCMockRecorder
的实例。OCMock通过拦截OCMockRecorder
未实现的方法工作。因此,您不能真正模拟由NSProxy
、NSObject
或OCMockRecorder
定义的方法。通过此测试,您将获得相同的结果:
-(void)testSomething {
id mock = [OCMockObject mockForClass:[NSObject class]];
[[[mock expect] andReturn:OCMOCK_VALUE((int){2})] hash];
[mock hash];
[mock verify];
}
如果这不仅仅是一个学术练习,而且您希望实际测试自定义的
isEqual:
实现,那么就没有理由对其进行模拟。只需直接用测试中应该和不应该匹配的对象调用isEqual:
。嘿,我注意到了,我改变了我的测试,但是isEqual:和hash的自定义重写呢?任何NSObject协议方法的重写都很难模拟出来(除非您有一个OCMockClassObject的自定义子类来显式处理它)。通常,这些方法仅在值类型对象上被重写(即,在不同的实例之间不需要区分的任何上下文),而且直接测试它们几乎总是比使用模拟更容易。你应该能够分配这些对象并调用这些方法。@L\u Sonic关于isEqual:和hash的自定义重写呢?如果你想测试重写的行为,为什么要模拟它?你是对的。当我开始测试wro时,我意识到了这一点ng的东西。它涉及到测试接口(方法应该做什么)和实现(方法的内容)的细线。编码10-12个小时会让你的大脑变得混乱:D