OcMock - Stub/expect/stopmocking

Zay*_*ige 3 objective-c ocmock

在我的夹具setUp我有以下

-(void)setUp{
    _vc = [OCMockObject partialMockForObject:[[InboxViewController alloc] init]];
    //stub out the view stuff
    [[_vc stub] removeTask:OCMOCK_ANY];
    [[_vc stub] insertTask:OCMOCK_ANY];
}
Run Code Online (Sandbox Code Playgroud)

夹具中有15个测试,但是,我需要实际测试这两个方法是否被调用,所以我写了2个测试

-(void)someTest{
    [[_vc expect] removeTask:OCMOCK_ANY];
    [_vc removeAllTasksFromList:taskList notInList:newTaskList];
    [_vc verify];
}
Run Code Online (Sandbox Code Playgroud)

但那次测试失败了

我也试过了

-(void)someTest{
    [[_vc stopMocking];
    [[_vc expect] removeTask:OCMOCK_ANY];
    [[_vc stub] removeTask:OCMOCK_ANY];
    [_vc removeAllTasksFromList:taskList notInList:newTaskList];
    [_vc verify];
} 
Run Code Online (Sandbox Code Playgroud)

但测试仍然失败.我错过了什么,或者这就是OCMock的工作方式?

我能让它发挥作用的唯一方法就是这样

-(void)someTest{
    //re create and init the mock object 
    _vc = [OCMockObject partialMockForObject:[[InboxViewController alloc] init]]; 
    [[_vc expect] removeTask:OCMOCK_ANY]; 
    [[_vc stub] removeTask:OCMOCK_ANY]; 
    [_vc removeAllTasksFromList:taskList notInList:newTaskList]; 
    [_vc verify]; 
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*urg 8

也许文档应该更清晰.什么stopMocking确实对部分模拟是为了还原真实的对象,你的情况InboxViewController,到原来的状态.调用stopMocking不会重置模拟对象,这意味着它不会清除存根和期望.您始终可以调用stopMocking,然后为同一个真实对象创建一个新的模拟.

正如在另一个答案中指出的那样,通常可以更好地避免使用存根和期望相同的方法,但是如果必须这样做,请确保在存根之前设置期望值; 否则存根将处理调用,期望永远不会看到它们.

我知道传统上很多人建议使用设置方法来设置测试主题.多年来,我个人的经验是,它通常不值得.在每个测试中保存几行可能看起来很有吸引力,但最终它确实在各个测试之间创建了耦合,使得套件更加脆弱.

  • 如何提取测试对象创造耦合的好点! (4认同)