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

tgr*_*grf 3 ios ocmockito

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

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

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

Mac*_*zko 7

取决于myMethod功能,有三种可能性.

移动myMethod从调出init

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

检查对象的状态

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

测试方法......

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

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