使用 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,表明从对象设计的角度来看可能有问题。
我想测试我的 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,表明从对象设计的角度来看可能有问题。