2011-03-25 99 views

回答

18

查看OCMock的test file,看起来您需要拥有与您打电话相同数量的expect。所以,如果你someMethod三次,你需要做的......

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

...test code... 

[mock verify]; 

这似乎难看不过,也许你可以把它们放在一个循环?

+5

我认为这只是验证该方法被调用至少3倍,所以它会如果被称为4次,也会通过。 – 2014-01-22 13:56:46

+1

我对v2.2.3的测试表明,需要准确匹配期望数量和调用someMethod – Skotch 2014-04-03 22:52:42

+2

@dB&Skotch的次数:这取决于您使用的模拟类型 - 如果您创建了一个niceMock它期望'至少'数字 - 对于通常的模拟,它期望我使用OCMock 3.x的准确数字 – 2015-01-06 14:50:59

13

我已经通过利用委托给一个块的能力,取得了成功:

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

块里面,我只是增加一个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应始终是相同的次数的方法实际上被称为号码。

+0

然后,您必须对所有类存根方法执行此操作,并且不能调用'OCMVerifyAll(mock)',对吧?你知道现在的OCMock版本还是最好的吗? (OCMockito似乎在这方面有更好的支持。) – Drux 2015-02-15 20:22:25

+0

我同意我希望OCMock能够更好地支持'''OCMVerify(stub,callCount)''',但是这个效果很好。很好的答案。 – 2015-04-16 17:53:21

+0

类似的想法:使用[OCMArg checkWithBlock:]并更新该块的callCount。但不知何故,这不能按预期工作。对于每个方法调用,checkWithBlock被调用2次。 – JanR 2016-12-16 11:29:57

1

如果需要检查,如果一个方法只叫一次,你可以做这样的

[self.subject doSomething]; 
OCMVerify([self.mock method]); 

OCMReject([self.mock method]); 
[self.subject doSomething]; 
相关问题