我可能不完全理解模拟,因为我对一个非常基本的场景有一个迫切的问题。如何测试类的实例方法或如何测试类的类别方法?
考虑一个 PeerMessage
类,它定义了一些属性等。我为 PeerMessage
创建了我自己的自定义类别,称为 Type
,我在其中定义了一个方法,isTextMessage:
。 isTextMessage
根据 PeerMessage
的内容返回一个 bool 值。 (请注意,这只是一个样本类型。)
在使用 OCMock 的测试中,我配置了一个类型为 PeerMessage
的 mock,并将其内容设置为某个有效值,如下所示:
id peerMessage = [OCMockObject mockForClass:[PeerMessage class]];
[[[peerMessage stub] andReturn:@"<valid>"] content];
然后断言 peerMessage 是一条文本消息:
XCTAssert([peerMessage isTextMessage]);
考虑到模拟的工作原理,这会导致:“调用了意外的方法”。显然,因为我没有具体说明我在期待它;我也没有 stub 。因为我只是想验证这个 API。
如何测试这些实例方法(在本例中为类别实例方法)。一种方法是按如下方式重新设计类别:
代替
- (BOOL)isTextMessage;
做:
+ (BOOL)isTextMessage:(PeerMessage *)message;
但这对我来说非常不自然,我不想编写这段代码,尽管我没有发现它有任何问题。它不需要是类方法。 :/
(如果我对这个问题的解释有点模棱两可,我很乐意更新。)
最佳答案
你想使用部分模拟,就像这样:
id peerMessage = [OCMockObject partialMockForObject:[[PeerMessage alloc] init]];
[[[peerMessage stub] andReturn:@"<valid>"] content];
XCTAssert([peerMessage isTextMessage]);
这样,您要测试的 isTextMessage
的真正实现被调用,但您仍然可以在该对象上 stub 其他方法。
关于ios - OCMock测试类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565147/