19

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

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error

我希望它返回一个小字典,以便我的测试可以确保代码正确使用字典。然而,无论我做什么,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]];

他们都没有工作。OCMock 是否支持将句柄作为存根消息参数,如果支持,正确的方法是什么?

4

5 回答 5

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

或者

NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];

你也可以做

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];

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

于 2009-12-17T21:39:35.270 回答
3

使用 ARC,您的方法声明可能如下所示:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error;

以下是我如何模拟这些类型的方法:

BOOL mockDoSomething = YES;

NSError __autoreleasing *error = nil;

[[[mock stub] andReturn:someDict] uploadValues:OCMOCK_VALUE(mockDoSomething) error:&error];
于 2012-08-09T23:26:10.093 回答
3
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];

[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})]
   yourMethodCall:err];
于 2013-03-06T17:54:10.727 回答
3

我在 OCMArg 上创建了一个类别来帮助解决这种情况。

OCMArg+Helpers.h:

@interface OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError;

@end

OCMArg+Helpers.m:

@implementation OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError {
    return (NSError *__autoreleasing *)[OCMArg anyPointer];
}

@end

然后,每当我有一个错误参数时,我需要模拟,使用anyError,像这样:

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
于 2014-01-03T20:55:52.447 回答
-4

可悲的是,我也没有找到一个好的解决方案。我能说的最好的办法是尽量使用 NSError** 尽可能小,然后把它放在一个独立的函数中,你可以在你的部分模拟上完全模拟出来。

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

于 2009-12-09T22:01:39.823 回答