我怎么嘲笑,接受一个手柄在OCMock参数的方法?
-
18-09-2019 - |
题
我试图嘲笑具有以下签名的等效的方法:
- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error
我希望它返回一个小字典,这样我的测试可以确保该代码使用字典正确。但是,无论我做什么OCMock总是从该方法返回零,不管我怎么存根出来。错误开始如在我测试的代码零,并且这些是不同的方式我试过磕碰它:
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支持手柄作为存根信息参数,如果是,什么是做正确的方法是什么?
解决方案
不幸的是,我还没有找到这种良好的解决办法。我能说的最好的是尽量让使用NSError的**尽可能小,然后把它在一个孤立的功能,你可以完全模拟出你的部分模拟。
我发现,使用任何比一个NSObject *其他(或衍生的)或原始值(NSInteger的,BOOL等)的任何代码是几乎不可能使用OCMock测试
其他提示
[[[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。
使用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];
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];
[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})]
yourMethodCall:err];
我创建上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
然后,每当我有一个错误PARAM我需要模拟,使用anyError
,像这样:
[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
不隶属于 StackOverflow