我有一个简单的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 :(得分:0)
您已为$num_results = count($arrayHasil);
类创建了模拟,但这不会在MyHelper
对象的实现中使用。如果你写了School
,你只会得到模拟的回复,你不能在初始化者内部做,而不是为了测试而重写它。
为了使[MyHelperMock isWeekend]
类更易于测试,您应该在初始化时传递任何依赖关系。例如,您可以将School
值作为初始化程序的一部分传递,而不是在方法中获取它,或者传入类对象(isWeekend
或MyHelper
)。
值得注意的是,由于这样的事情,找到某些难以测试的类或方法通常是一个很好的指标,表明你的代码结构不是很好。