如何使用OCMock验证方法永远不会被调用?

Jus*_*oss 33 cocoa mocking objective-c mockito ocmock

在我的日常工作中,我被Mockito的never()验证所破坏,这可以确认一个模拟方法永远不会被调用.

有没有办法用Objective-C和OCMock完成同样的事情?我一直在使用下面的代码,它可以工作,但感觉就像一个黑客.我希望有更好的方法......

- (void)testSomeMethodIsNeverCalled {
    id mock = [OCMockObject mockForClass:[MyObject class]];
    [[[mock stub] andCall:@selector(fail) onObject:self] forbiddenMethod];

    // more test things here, which hopefully
    // never call [mock forbiddenMethod]...
}

- (void)fail {
    STFail(@"This method is forbidden!");
}
Run Code Online (Sandbox Code Playgroud)

Ins*_*ame 61

自OCMock的r69以来,可以拒绝方法调用http://svn.mulle-kybernetik.com/OCMock/trunk/Source/Changes.txt

好的模拟/快速失败当在未使用expect或stub设置的模拟对象上调用方法时,模拟对象将引发异常.可以通过创建"漂亮"模拟来关闭此失败快速模式:

id mock = [OCMockObject niceMockForClass:[SomeClass class]]
Run Code Online (Sandbox Code Playgroud)

虽然好的模拟将忽略所有意外的方法,但可以禁止特定的方法:

[[mock reject] someMethod]
Run Code Online (Sandbox Code Playgroud)

请注意,在故障快速模式下,如果忽略该异常,则在调用verify时将重新抛出该异常.这使得可以确保可以检测到来自通知等的不期望的调用.

引用自:http://www.mulle-kybernetik.com/software/OCMock/#features


Joh*_*lph 19

据我所知,当您调用verify时,OCMock将自动失败,并且调用尚未记录的方法.如果调用意外方法就不会抱怨的模拟被称为"漂亮的模拟".

- (void)testSomeMethodIsNeverCalled {
    id mock = [OCMockObject mockForClass:[MyObject class]];

    [mock forbiddenMethod];
    [mock verify]; //should fail
}
Run Code Online (Sandbox Code Playgroud)


Man*_*lan 8

从版本3.3开始,OCMock具有OCMReject宏.

    id mock = OCMClassMock([MyObject class]);
    OCMReject([mock forbiddenMethod]);

    // exception will raise
    [mock forbiddenMethod];
Run Code Online (Sandbox Code Playgroud)