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

Verify method call within init* with OCMockito

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

我一直在尝试以如此幼稚的方式做到这一点,但正如你想象的那样,没有成功:

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

存在三种可能性,具体取决于 myMethod 功能。

init

移动myMethod呼出

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

检查对象的状态

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

测试方法...

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

这真的很 hacky,表明从对象设计的角度来看可能有问题。