使用相同的方法调用OCMStub和OCMReject

时间:2018-01-24 00:09:44

标签: objective-c xctest ocmock

我一直试图使用OCMReject编写一些失败的快速测试。但是我发现如果OCMStub与OCMReject一起使用,那么这个测试将通过

ffmpeg -i audio-in.wav -lavfi showspectrumpic image-out.png

即使它应该明显失败,因为我正在调用我在OCMReject方法中设置的功能。

我意识到只要我期望从中得到结果并将其从此测试中删除,我就可以存根getPreferences,但这主要意味着如果我在setUp方法中设置了getPreferences的存根,那么任何测试调用id _mockModel = OCMProtocolMock( @protocol( CTPrefModelProtocol)); //It doesn't seem to matter what order these two are in, the test behaves the same OCMStub([_mockModel getPreferences]); OCMReject([_mockModel getPreferences]); [_mockModel getPreferences]; 只会被忽略。

为什么我无法一起使用OCMStub和OCMReject?是因为OCMStub以某种方式改变了getPreferences,因此每当我调用这个方法时,它实际上会调用其他方法吗?

1 个答案:

答案 0 :(得分:0)

显然我看不懂。阅读OCMock 3文档,标题为 10.2

  

在相同方法的存根之后设置期望不起作用

id mock = OCMStrictClassMock([SomeClass class]);
OCMStub([mock someMethod]).andReturn(@"a string");
OCMExpect([mock someMethod]);

/* run code under test */

OCMVerifyAll(mock); // will complain that someMethod has not been called
  

上面的代码首先为someMethod设置存根,然后为   期望相同的方法。由于模拟对象的方式   目前实现的对someMethod的任何调用都由存根处理。   这意味着即使调用该方法,验证也会失败。它是   可以通过添加andReturn到期望来避免这个问题   声明。您也可以在期望之后设置存根。

我怀疑OCMReject也存在同样的限制。希望这有助于像我一样盲目的人。懒惰的link to the documentation