Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在自定义isEqual实现上预期并调用isEqual时,OCMock失败_Ios_Ocmock_Xctest - Fatal编程技术网

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