OCMock 测试类别方法
Posted
技术标签:
【中文标题】OCMock 测试类别方法【英文标题】:OCMock test category methods 【发布时间】:2015-06-01 03:16:38 【问题描述】:我可能不完全理解嘲笑,因为我对一个非常基本的场景有一个迫切的问题。如何测试类的实例方法或如何测试类的类别方法?
考虑一个类PeerMessage
,它定义了一些属性等。我为PeerMessage
创建了我自己的自定义类别,称为Type
,我在其中定义了一个方法isTextMessage:
。 isTextMessage
根据 PeerMessage
的内容返回一个布尔值。 (请注意,这只是一个示例类型。)
在使用 OCMock 的测试中,我配置了一个 PeerMessage
类型的模拟并将其内容设置为某个有效值,如下所示:
id peerMessage = [OCMockObject mockForClass:[PeerMessage class]];
[[[peerMessage stub] andReturn:@"<valid>"] content];
然后断言 peerMessage 是一条文本消息:
XCTAssert([peerMessage isTextMessage]);
考虑到模拟的工作原理,这会导致:“调用了意外的方法”。显然,因为我没有具体说明我期待它;我也没有存根。因为我只是想验证这个 API。
如何测试这些实例方法(在本例中为类别实例方法)。一种方法是重新设计类别,如下所示:
而不是
- (BOOL)isTextMessage;
做:
+ (BOOL)isTextMessage:(PeerMessage *)message;
但这对我来说是非常不自然的,我不想编写这段代码,尽管我看不出它有什么问题。它不需要是类方法。 :/
(如果我对这个问题的解释有点模棱两可,我很乐意更新。)
【问题讨论】:
【参考方案1】:您想使用部分模拟,以某种方式如下:
id peerMessage = [OCMockObject partialMockForObject:[[PeerMessage alloc] init]];
[[[peerMessage stub] andReturn:@"<valid>"] content];
XCTAssert([peerMessage isTextMessage]);
这样,您要测试的isTextMessage
的真正实现被调用,但您仍然可以存根对象上的其他方法。
【讨论】:
哦!嗯,这解决了一大堆其他的担忧。谢谢。以上是关于OCMock 测试类别方法的主要内容,如果未能解决你的问题,请参考以下文章
OCMock 对带有参数的方法进行 OCMock 并返回一个值