2016-05-24 41 views
0

我有一个简单School类,其限定了init方法:单元测试非常简单的方法,但未能

@implementation School 
- (id) init { 
    self = [super init]; 
    if (self) { 
     // call class method of MyHelper class 
     if ([MyHelper isWeekend]) { 
      [MyHelper doSomething]; 
     } 
    } 
} 
@end 

MyHelper是一类只包含类的方法,所述isWeekend是一个类方法返回一个布尔值)

我使用OCMock单元测试这个简单的方法init

- (void)testInit { 
    // mock a school instance 
    id schoolMock = [OCMockObject partialMockForObject:[[School alloc] init]]; 

    // mock class MyHelper 
    id MyHelperMock = OCMStrictClassMock([MyHelper class]); 
    // stub class method 'isWeekend()' to return true 
    OCMExpect([MyHelperMock isWeekend]).andReturn(true); 

    // run init method 
    [schoolMock init]; 

    // verify 
    OCMVerify([MyHelperMock isWeekend]); 

} 

但是运行时出现错误:

OCMockObject(MyHelper): Method isWeekend was not invoked.为什么?

回答

0

您已经为MyHelper类创建了一个模拟,但是这不会在您的School对象的实现中使用。如果你写了[MyHelperMock isWeekend],你只会得到嘲讽的回应,如果你不能在测试中重写它,你不能在初始化程序中做。

为了让您的School类更具可测性,您应该传递任何对初始化的依赖关系。例如,您可以传递isWeekend作为初始化程序的一部分,而不是在方法中获取它,或传入类对象(MyHelperMyHelperMock)。

值得注意的是,找到某些类或方法难以测试,因为这样的事情往往是一个很好的指标,说明你的代码结构不是很好。