OCMock测试类方法

OCMock test category methods

我可能不完全理解模拟,因为我对一个非常基本的场景有一个迫切的问题。如何测试 class 的实例方法或如何测试 class 的类别方法?

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

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

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

然后断言peerMessage是一条短信:

XCTAssert([peerMessage isTextMessage]);

考虑到模拟的工作原理,结果是:'Unexpected method invoked'。显然,因为我没有具体说明我在期待它;我也没有存根。因为我只是想验证这个 API.

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

而不是

- (BOOL)isTextMessage;

做:

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

但这对我来说非常不自然,我不想编写这段代码,尽管我没有发现它有任何问题。它不需要是 class 方法。 :/

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

您想使用部分模拟,就像这样:

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

这样,您要测试的 isTextMessage 的真正实现被调用,但您仍然可以在该对象上存根其他方法。