我如何在OCMock中模拟一个接受句柄作为参数的方法?

Kev*_*lar 18 unit-testing mocking objective-c handle ocmock

我正在尝试模拟一个具有以下签名等效方法:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)

我希望它返回一个小字典,以便我的测试可以确保代码正确使用字典.但是,无论我做什么,OCMock总是从方法中返回nil,无论我如何将其存根.错误在我正在测试的代码中以nil开头,这些是我尝试将其存根的不同方式:

NSError * error = nil;
[[[mock stub] andReturn:someDict] uploadValues:YES error:&error];

[[[mock stub] andReturn:someDict] uploadValues:YES error:nil];

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg any]];
Run Code Online (Sandbox Code Playgroud)

并且它们都不起作用.OCMock是否支持处理作为存根消息参数,如果是,那么正确的方法是什么?

And*_*den 48

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]];
Run Code Online (Sandbox Code Playgroud)

要么

NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];
Run Code Online (Sandbox Code Playgroud)

你也可以这样做

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];
Run Code Online (Sandbox Code Playgroud)

但这可能会导致您的代码错误地认为您传回了一个真正的NSError.

  • 在OCMock的最新版本中,您可以使用`[OCMArg anyObjectRef]`而不是`[OCMArg anyPointer]`来避免在处理Objective-C对象类型的指针指针(例如`NSError*)时ARC下的错误*`). (7认同)

Chr*_*ips -4

遗憾的是,我也没有找到好的解决方案。我能说的最好的办法是尝试使 NSError** 的使用尽可能小,然后将其放入一个独立的函数中,您可以在部分模拟中完全模拟该函数。

我发现任何使用除 NSObject*(或派生)或原始值(NSInteger、BOOL 等)以外的任何内容的代码几乎不可能使用 OCMock 进行测试。

  • 使用和提供接受 NSError ** 的方法是 Cocoa 中首选的错误处理机制。我建议坚持这种范例,并查看 Andreas Järliden 的答案来模拟这些方法。 (4认同)
  • 请参阅下面 Andreas Järliden 的回答。你的答案不正确。 (3认同)