ios - OCMock测试类方法

标签 ios unit-testing mocking ocmock

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

考虑一个 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/

相关文章:

ios - 无法通过 didSelectRowAtIndexPath 传递值

javascript - 使用 Rollup.js 时如何在 Jest 测试中正确模拟函数

angularjs - 如何在 Jasmine 测试中测试 $scope.$on 事件?

python - 如何在 Django 中使用模拟?

c# - FakeItEasy:根据表达式返回不同的对象

ios - iOS 中的 Google Admob 集成错误

objective-c - 如何重用 UIView 和方法 - iOS 中的 DRY 代码

iphone - 当我单击一个通知时从列表中删除所有推送通知

c++ - 解析 C++ 以生成单元测试 stub

android - Android 中的模拟静态函数