是否可以使用 OCMock 存根 NSProcessInfo?

Posted

技术标签:

【中文标题】是否可以使用 OCMock 存根 NSProcessInfo?【英文标题】:Is it possible to stub NSProcessInfo with OCMock? 【发布时间】:2016-02-02 03:27:45 【问题描述】:

我想存根[[NSProcessInfo processInfo] operatingSystemVersion] 以获取任何操作系统版本。

id processInfoMock = OCMClassMock([NSProcessInfo class]);
[OCMStub([processInfoMock operatingSystemVersion]) andReturnValue:NULL];
NSOperatingSystemVersion osVersion = [[NSProcessInfo processInfo] operatingSystemVersion];

但返回的是 ios 模拟器的操作系统版本。是否可以存根 NSProcessInfo 方法?而且,存根 Foundation 的课程是否合适?


[更新] 在 Erik 的建议下,问题解决了。我需要存根 processInfo 类方法以返回 NSProcessInfo 的模拟实例。这是测试通过的代码:

// Prepare fakeVersion instead of NULL.
NSOperatingSystemVersion fakeVersion = 0,0,0;
// Mock NSProcessInfo.
id processInfoMock = OCMClassMock([NSProcessInfo class]);
// Stub processInfo class method to return the mock instance.
[OCMStub([processInfoMock processInfo]) andReturn:processInfoMock];
// Stub operatingSystemVersion instance method to return fakeVersion.
[OCMStub([processInfoMock operatingSystemVersion]) andReturnValue:OCMOCK_VALUE(fakeVersion)];

// Another solution using OCMPartialMock.
// Partial mock for NSProcessInfo instance.
id processInfo = [NSProcessInfo processInfo];
id processInfoPartialMock = OCMPartialMock(processInfo);
// Stub operatingSystemVersion instance method to return fakeVersion.
[OCMStub([processInfoPartialMock operatingSystemVersion]) andReturnValue:OCMOCK_VALUE(fakeVersion)];

【问题讨论】:

【参考方案1】:

您必须通过存根processInfo 类方法来确保实际使用了模拟。这显示在 OCMock 网站首页上标题为“为实例和类方法创建存根”的部分中。

顺便说一句,为什么要混合不同的句法风格?为什么不直接写

OCMStub([processInfoMock operatingSystemVersion]).andReturn(NULL);

【讨论】:

感谢@erik-doernernburg 的评论。正如您所提到的,问题是我需要存根NSProcessInfoprocessInfo 类方法以返回模拟实例。我将更新我的问题以添加测试通过的代码。 关于语法 andReturn 由于某种原因在我的 Xcode 中不可用。它建议使用 _andReturn 方法,该方法需要一个 NSValue 参数。我使用 OCMock 3.2。你知道可能是什么问题吗?

以上是关于是否可以使用 OCMock 存根 NSProcessInfo?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 ocmock 存根 AppDelegate 上的属性?

OCMock 不能存根分类方法

OCMock:存根 @dynamic 属性

不能在 Xcode 5.0 中使用 OCMock 2.1+ 存根类方法

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