是否可以使用 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 的评论。正如您所提到的,问题是我需要存根NSProcessInfo
的processInfo
类方法以返回模拟实例。我将更新我的问题以添加测试通过的代码。
关于语法 andReturn 由于某种原因在我的 Xcode 中不可用。它建议使用 _andReturn 方法,该方法需要一个 NSValue 参数。我使用 OCMock 3.2。你知道可能是什么问题吗?以上是关于是否可以使用 OCMock 存根 NSProcessInfo?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ocmock 存根 AppDelegate 上的属性?