我有两节课。
对象1:
- (void) methodA {
ObjectB objectB = [[ObjectB alloc] init];
[objectB methodB];
}
和对象2:
- (void) methodB {
// Does something
}
使用OCMock,如何验证methodA
来电methodB
?我将测试设置如下:
id mock = OCMClassMock([Object2 class]);
OCMStub([mock methodB).andReturn(nil);
[self.object1 methodA];
OCMVerify([mock methodB]);
测试类正在测试object1,但是我想验证它是否在object2上调用了方法。运行此测试时,我收到了失败的消息:
Method methodB was not invoked.
我对模拟/存根仍然很陌生。我完全有可能将测试结构错误。模拟让我感到困惑,因为我正在测试Object1
,但试图在Object2
上验证某些内容。
我在设置此测试时是否正确思考?如果没有,我该怎么做呢?
答案 0 :(得分:0)
你必须确保(不知何故) enum Error: ErrorType {
case SomeExpectedError
case SomeUnexpectedError
}
func functionThatThrows() throws {
throw Error.SomeExpectedError
}
XCTAssertThrowsError(try functionThatThrows(), "some message") { (error) in
XCTAssertEqual(error as? Error, Error.SomeExpectedError)
}
使用模拟而不是Object1
的新实例。执行此操作的常用方法是依赖注入,即。 Object1依赖于Object2,但是Object2的实例不是创建Object2的实例,而是从外部设置(注入)。网上有很多关于它的东西。
使用OCMock,你可以用另一种方式破解你的方式。但不建议这样做。您可以将ObjectB
/ alloc
替换为init
,然后存根new
类方法以返回模拟。这样Object1就会使用模拟而不知道它。它仍然“认为”它分配了一个新的Object2实例。
new
这在9.3中的参考文档中提到。用于创建对象的存根方法。