Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
Iphone 如何使用OCMock验证方法调用的数量_Iphone_Objective C_Unit Testing_Ocmock - Fatal编程技术网

Iphone 如何使用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

有没有办法验证某个方法是否被多次调用“x”?

查看for OCMock,似乎需要与调用次数相同的
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次。