Unit testing 方法'的OCMock存根;s通过引用传递参数

Unit testing 方法'的OCMock存根;s通过引用传递参数,unit-testing,ios7,tdd,ocmock,xctest,Unit Testing,Ios7,Tdd,Ocmock,Xctest,我有一个方法,我需要存根。方法如下所示: BOOL myMethodWithError:(*__autoreleasing *NSError)error; 所以我模拟了这个对象,并试图通过“error”返回一个nil。我把它编码如下 id mockMyObject = [OCMockObject mockForClass:[MyObject class]]; BOOL retVal = YES; NSError *error = nil; [[[mockMyObject stub] andRe

我有一个方法,我需要存根。方法如下所示:

BOOL myMethodWithError:(*__autoreleasing *NSError)error;
所以我模拟了这个对象,并试图通过“error”返回一个nil。我把它编码如下

id mockMyObject = [OCMockObject mockForClass:[MyObject class]];
BOOL retVal = YES;
NSError *error = nil;
[[[mockMyObject stub] andReturn:OCMOCK_VALUE(retVal)] myMethodWithError:&error];
运行测试并操作模拟对象时,错误引用id似乎会更改。因此,mock抛出了一个异常:

OCMockObject[MyObject]:预期调用的方法: myMethodWithError:0xbfffca78

我尝试了许多不同的方法,但每次指针值在错误对象传递给方法后发生变化,从而导致模拟对象抛出错误

我只需要对照参数的pass-by-reference值测试我的业务规则,但我似乎无法让mock或测试对象配合

提前感谢,我们将非常感谢您的帮助。

使用ignoringNonObjectArgs

不能使用既不是对象也不是指针或选择器的参数 使用任意占位符忽略。不过,这是有可能的 mock忽略调用中的所有非对象参数:

在这个 案例模拟将接受SomeMethodWithInArgument的任何调用: 不管实际通过了什么论点。如果该方法具有对象 参数和非对象参数一样,对象参数可以 仍然可以像往常一样使用OCMArg上的方法进行约束

奖励答案

这也将解决您的问题:

[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] myMethodWithError:[OCMArg setTo:nil]];

除了Ben在回答中提到的解决方案(我只测试了基于
ignoringNonObjectArgs
的解决方案,效果很好),我更喜欢使用
[OCMArg anyPointer]
和适当的类型转换:

[[[myMock stub] andReturn:something] someMethod:(NSError * __autoreleasing *)[OCMArg anyPointer]];

我对这个问题有点更清楚了。在深入研究OCMock源代码测试之后,我发现在哪里执行了与我类似的测试。测试使用了[OCMArg isAnyPointer],它返回一个“void*”。这在ARC之前是可以的,但现在ARC不允许在“void*”和“NSError*\uu autoreleasing*”之间进行隐式转换。这似乎是我现在需要解决的问题。解决这个问题的一个更简单的方法是制作一个手摇的mock。哈!不知何故,我一直以clang不喜欢的方式误判
anyPointer
,并错过了明显的一个。=)
[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] myMethodWithError:[OCMArg setTo:nil]];
[[[myMock stub] andReturn:something] someMethod:(NSError * __autoreleasing *)[OCMArg anyPointer]];