Goa*_*ine 20

查看OCMock 的测试文件,您似乎需要拥有与expect调用相同数量的s.所以,如果你打someMethod三次电话,你需要做...

[[mock expect] someMethod];
[[mock expect] someMethod];
[[mock expect] someMethod];

...test code...

[mock verify];
Run Code Online (Sandbox Code Playgroud)

这看起来很难看,也许你可以把它们放在一个循环中?

  • 我认为这只会验证该方法至少被调用了3次,所以如果它被调用4次也会通过. (5认同)
  • @dB&Skotch:这取决于你使用的模拟类型 - 如果你创建一个niceMock它至少需要'这个数字 - 对于一个普通的模拟它需要确切的数字 (2认同)

aki*_*don 12

通过利用委托给块的能力,我获得了成功:

OCMStub([mock someMethod]).andDo(^(NSInvocation *invocation)
{ /* block that handles the method invocation */ });
Run Code Online (Sandbox Code Playgroud)

在块中,我只是递增一个callCount变量,然后断言它与预期的调用次数匹配.例如:

- (void)testDoingSomething_shouldCallSomeMethodTwice {
    id mock = OCMClassMock([MyClass class]);

    __block int callCount = 0;
    OCMStub([mock someMethod]).andDo(^(NSInvocation *invocation) {
        ++callCount;
    });

    // ...exercise code...

    int expectedNumberOfCalls = 2;
    XCTAssertEqual(callCount, expectedNumberOfCalls);
}

每次调用时都应调用该块someMethod,因此callCount应始终与实际调用该方法的次数相同.