单元测试一个非常简单的方法,但失败了

时间:2016-05-24 08:28:23

标签: ios objective-c unit-testing ocmock

我有一个简单的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.为什么?

1 个答案:

答案 0 :(得分:0)

您已为$num_results = count($arrayHasil); 类创建了模拟,但这不会在MyHelper对象的实现中使用。如果你写了School,你只会得到模拟的回复,你不能在初始化者内部做,而不是为了测试而重写它。

为了使[MyHelperMock isWeekend]类更易于测试,您应该在初始化时传递任何依赖关系。例如,您可以将School值作为初始化程序的一部分传递,而不是在方法中获取它,或者传入类对象(isWeekendMyHelper)。

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