3

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

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

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

我只需要针对参数的传递引用值测试我的业务规则,但我似乎无法让模拟或测试对象进行合作。

在此先感谢,任何帮助将不胜感激。

4

2 回答 2

6

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

[[[myMock stub] andReturn:something] someMethod:(NSError * __autoreleasing *)[OCMArg anyPointer]];
于 2013-12-02T17:21:43.177 回答
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]];
于 2013-12-02T16:27:52.917 回答