验证从另一个对象OCMock调用方法

时间:2016-03-23 15:40:31

标签: objective-c testing mocking stub ocmock

我有两节课。

对象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上验证某些内容。

我在设置此测试时是否正确思考?如果没有,我该怎么做呢?

1 个答案:

答案 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中的参考文档中提到。用于创建对象的存根方法。