我可能不完全理解嘲笑,因为我对一个非常基本的场景有一个亟待解决的问题。如何测试类的实例方法或如何测试类的类别方法?
考虑一个类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;
但这对我来说非常不自然,我不想写这段代码,虽然我没有看到它有什么问题。它不需要是类方法。 :/
(如果我对这个问题的解释有点含糊不清,我很乐意更新。)
答案 0 :(得分:2)
你想使用部分模拟,不管怎么样:
id peerMessage = [OCMockObject partialMockForObject:[[PeerMessage alloc] init]];
[[[peerMessage stub] andReturn:@"<valid>"] content];
XCTAssert([peerMessage isTextMessage]);
这样,调用了isTextMessage
的实际实现,即你要测试的实现,但你仍然可以在对象上存根其他方法。