Iphone 如何使用OCMock验证方法调用的数量
有没有办法验证某个方法是否被多次调用“x”?查看for OCMock,似乎需要与调用次数相同的Iphone 如何使用OCMock验证方法调用的数量,iphone,objective-c,unit-testing,ocmock,Iphone,Objective C,Unit Testing,Ocmock,有没有办法验证某个方法是否被多次调用“x”?查看for OCMock,似乎需要与调用次数相同的expects。因此,如果您调用someMethod三次,您需要执行以下操作 [[mock expect] someMethod]; [[mock expect] someMethod]; [[mock expect] someMethod]; ...test code... [mock verify]; 这看起来很难看,也许你可以把它们放在一个循环中?我成功地利用了委托给一个块的能力: OCMS
expect
s。因此,如果您调用someMethod
三次,您需要执行以下操作
[[mock expect] someMethod];
[[mock expect] someMethod];
[[mock expect] someMethod];
...test code...
[mock verify];
这看起来很难看,也许你可以把它们放在一个循环中?我成功地利用了委托给一个块的能力:
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);
}
-(void)testDoingSomething\u应该调用somemethod两次{
id mock=OCMClassMock([MyClass]);
__block int callCount=0;
OCMStub([mock someMethod]).andDo(^(NSInvocation*调用){
++呼叫数;
});
//…练习代码。。。
int expectedNumberOfCalls=2;
xctasertequal(callCount,expectedNumberOfCalls);
}
每次调用
someMethod
时都应该调用该块,因此callCount
应该始终与实际调用该方法的次数相同。如果需要检查某个方法是否只调用一次,可以这样做
[self.subject doSomething];
OCMVerify([self.mock method]);
OCMReject([self.mock method]);
[self.subject doSomething];
我认为这只验证了该方法至少被调用了3次,因此,如果它被调用了4次,它也会通过。我用v2.2.3进行的测试表明,expected的数量和对它的调用数量需要精确匹配someMethod@dB&Skotch:这取决于您使用的模拟的类型-如果您创建一个niceMock,它期望“至少”这个数字-对于一个普通的模拟,它期望确切的数字numberI正在使用OCMock 3.x,即使在使用部分mock时,当调用数大于预期值时,我也不会失败。然后,您必须在所有类存根方法上执行此操作,并且不能调用
OCMVerifyAll(mock)
,对吗?您知道对于OCMock的当前版本,仍然是最好的方法吗?(OCMockito似乎在这方面有更好的支持。)我同意我希望OCMock能更好地支持OCMVerify(存根,调用计数)
,但这很有效。回答得很好。类似的想法是:使用[OCMArg checkWithBlock:]并从该块更新调用计数。但不知何故,这并没有像预期的那样起作用。每次方法调用都会调用checkWithBlock 2次。