【问题标题】:OCMock fails when expecting and calling isEqual on Custom isEqual implementation在自定义 isEqual 实现上期望和调用 isEqual 时,OCMock 失败
【发布时间】:2014-04-17 03:05:52
【问题描述】:

考虑下面的代码

OCMockObject *mock = [OCMockObject mockForClass:[NSObject class]];
[[[mock expect] andReturnValue:OCMOCK_VALUE((BOOL){YES})] isEqual:[OCMArg any]];
[mock isEqual:[NSObject new]];
[mock verify];

有人可以告诉我为什么会失败

测试失败:-[NSObject_tests testIsEqualIsCalled] 失败: OCMockObject[NSObject]: 预期的方法没有被调用: (null)

这实际上毫无意义。我尝试使用andReturn: 而不是andReturnValue:,但仍然没有。

【问题讨论】:

    标签: ios ocmock xctest


    【解决方案1】:

    expect 返回OCMockRecorder 的实例。 OCMock 通过拦截 OCMockRecorder 未实现的方法来工作。所以你不能真正模拟由NSProxyNSObjectOCMockRecorder 定义的方法。您将通过此测试获得相同的结果:

    -(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 子类来显式处理它)。通常这些方法只在值类型对象上被覆盖(即,永远不会期望有 any 上下文需要区分不同的实例),并且直接测试这些几乎总是更容易,而不是而不是使用模拟。您应该能够分配这些对象并调用方法。
    • @L_Sonic isEqual: 和哈希的自定义覆盖怎么样?如果您想测试覆盖的行为,为什么要模拟它?
    • 你是对的。当我开始测试错误的东西时,我意识到了这一点。它来到了测试接口(方法应该做什么)和实现(方法的内容)的那条细线。 10-12 小时的编码可以让你的大脑变得糊涂:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多