OCMock 不能存根分类方法

Posted

技术标签:

【中文标题】OCMock 不能存根分类方法【英文标题】:OCMock can't stub a category method 【发布时间】:2014-07-09 15:42:07 【问题描述】:

我正在尝试使用 NSMutableURLConnection 的模拟,但 OCMock 不想对在 NSMutableURLConnectionNSHTTPURLRequest 类别中声明的方法进行存根。

id requestMock = OCMClassMock([NSMutableURLRequest class]);
OCMStub([requestMock setHTTPBody]);

编译器不会接受第二行。我得到“ARC语义问题:选择器'setHTTPBody'没有已知的实例方法。”

编译器允许我存根HTTPBody(而不是setHTTPBody),但它永远不会被调用。

有人知道如何获得一个工作存根在这种情况下让编译器满意吗?

【问题讨论】:

【参考方案1】:

方法名是setHTTPBody:(末尾有一个冒号,表示一个参数)。冒号是方法名称的重要组成部分。编译器错误是准确的;您需要使用正确的方法名称。

但是,您正在使用一个不错的类模拟,它将有一个空的 setHTTPBody 实现:它不会做任何事情(不会存储数据),因此调用它不会对使用访问器的其他代码有帮助。您可以尝试通过创建一个不太好的模拟来找出确实调用了哪些方法,这将为任何意外的方法抛出异常,并通过反复试验找到真正需要的方法。或者,也许创建一个常规的 NSMutableURLRequest 对象,并从中创建一个部分模拟,仅存根您需要更改的方法,但不理会其余的行为。

【讨论】:

以上是关于OCMock 不能存根分类方法的主要内容,如果未能解决你的问题,请参考以下文章

OCMock 中的存根类方法

不能存根方法“标题”,因为模拟类 OCMock 中不存在此类方法

所有调用的 OCMock 存根类方法

正在测试的类的 OCMock 存根类方法

如何使用 ocmock 在基于类的方法上存根返回值

OCMock: OCMPartialMock 对象调用实际方法而不是存根