OCMock测试类别方法

时间:2015-06-01 03:16:39

标签: ios unit-testing mocking ocmock

我可能不完全理解嘲笑,因为我对一个非常基本的场景有一个亟待解决的问题。如何测试类的实例方法或如何测试类的类别方法?

考虑一个类PeerMessage,它定义了一些属性等。我为PeerMessage创建了一个名为Type的自定义类别,我在其中定义了一个方法isTextMessage:isTextMessage根据PeerMessage的内容返回布尔值。 (请注意,这只是一个样本类型。)

在使用OCMock的测试中,我配置了PeerMessage类型的模拟,并将其内容设置为某个有效值,如下所示:

id peerMessage = [OCMockObject mockForClass:[PeerMessage class]];
[[[peerMessage stub] andReturn:@"<valid>"] content];

然后断言peerMessage是一条短信:

XCTAssert([peerMessage isTextMessage]);

考虑到模拟是如何工作的,这会导致:&#39;调用了意外的方法&#39;。显然,正如我没有说明我期待的那样;我也没有留下它。我只是想验证这个API。

如何测试这些实例方法(在本例中为类别实例方法)。一种方法是按如下方式重新设计类别:

而不是

- (BOOL)isTextMessage;

做的:

+ (BOOL)isTextMessage:(PeerMessage *)message;

但这对我来说非常不自然,我不想写这段代码,虽然我没有看到它有什么问题。它不需要是类方法。 :/

(如果我对这个问题的解释有点含糊不清,我很乐意更新。)

1 个答案:

答案 0 :(得分:2)

你想使用部分模拟,不管怎么样:

id peerMessage = [OCMockObject partialMockForObject:[[PeerMessage alloc] init]];
[[[peerMessage stub] andReturn:@"<valid>"] content];
XCTAssert([peerMessage isTextMessage]);

这样,调用了isTextMessage的实际实现,即你要测试的实现,但你仍然可以在对象上存根其他方法。