使用OCMockito验证init *中的方法调用

时间:2015-03-25 09:46:51

标签: ios ocmockito

我想测试我的init*方法是否使用OCMockito调用其体内的其他方法。这是可能的,如果,我该怎么办?让我们说,我想检查是否已调用[self myMethod]

我一直试图以这种天真的方式做到这一点,但你可以想象,没有成功:

it(@"should trigger myMethod", ^{
    DetailsView *mockDetailsView = mock([DetailsView class]);
    [mockDetailsView initWithFrame:CGRectZero];
    [verify(mockDetailsView) myMethod];
});

1 个答案:

答案 0 :(得分:7)

根据myMethod功能,有三种可能性。

myMethod

移出init来电

如果myMethod实现了对象的非常具体的逻辑,它应该由对象的所有者显式调用。除了设置初始状态之外,对象创建不应该做任何事情。然后,如果它不在init中,则很容易测试。

检查对象的状态

如果'myMethod`以某种方式配置对象,您可以测试其属性或状态,而不是检查方法是否被调用,因为它是次要的 - 最终结果很重要。

测试方法......

最后,如果您确实需要测试是否调用myMethod,并且以上都不适用(不应该发生),则可以在方法体中设置属性self.myMethodCalled = YES。 这非常难看,所以你可以从你的类派生,覆盖myMethod并在那里设置属性,然后验证这个调用子类的调用(这是不安全和不纯的)。

这真的很hacky并且表明从对象设计的角度来看可能是错误的。