我想存根[[NSProcessInfo processInfo] operatingSystemVersion]以获取任何OS版本。

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

但是返回了iOS模拟器的OS版本。是否可以对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)];

最佳答案

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

顺便问一下,为什么要混合使用不同的句法样式?为什么不只是写

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

10-08 12:34