方法的pass-by-reference参数的OCMock存根

时间:2013-12-01 01:06:43

标签: unit-testing ios7 tdd ocmock xctest

我有一个我需要存根的方法。该方法的形式如下:

BOOL myMethodWithError:(*__autoreleasing *NSError)error;

所以我嘲笑了这个对象并试图通过'错误'返回一个零。我把它编码如下。

id mockMyObject = [OCMockObject mockForClass:[MyObject class]];
BOOL retVal = YES;
NSError *error = nil;
[[[mockMyObject stub] andReturn:OCMOCK_VALUE(retVal)] myMethodWithError:&error];

运行测试并运行模拟对象时,错误引用ID似乎会更改。因此模拟会抛出异常:

  

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

我尝试了许多不同的方法,但每次将错误对象传递给导致模拟对象抛出错误的方法时指针值都会发生变化。

我只需要根据参数的pass-by-reference值来测试我的业务规则,但我似乎无法让mock或test对象合作。

提前致谢,我们将非常感谢任何帮助。

2 个答案:

答案 0 :(得分:6)

除了Ben在他的回答中提到的解决方案(我只测试了基于ignoringNonObjectArgs的解决方案,并且工作正常),我更喜欢使用[OCMArg anyPointer]和适当的演员:

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

答案 1 :(得分:2)

使用 ignoringNonObjectArgs

[[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] ignoringNonObjectArgs] myMethodWithError:NULL];

来自http://ocmock.org/features/

  

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

[[[mock expect] ignoringNonObjectArgs] someMethodWithIntArgument:0] 
  

在此   如果mock将接受someMethodWithIntArgument的任何调用:   无论实际传递什么参数。如果方法有对象   参数以及非对象参数,对象参数可以   仍然像往常一样使用OCMArg上的方法进行约束。

奖励回答

这也可以解决您的问题:

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