我一直试图使用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,因此每当我调用这个方法时,它实际上会调用其他方法吗?
答案 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。