如何使用引用参数存根调用方法?

时间:2014-03-11 16:12:44

标签: objective-c unit-testing ocmock

考虑一下:

+(NSDictionary *)getDictionaryFromData:(id)data {
    @synchronized(self) {
        NSError *error = nil;
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
        if (error) {
            DLog(@"SERIALIZATION FAILED: %@", error.localizedDescription);
            return nil;
        }

        DLog(@"SUCCESS: %@", dict);
        return dict;
    }
}

如果错误不是nil,如何模拟 getDictionaryFromData 来获取覆盖率?是否有可能或者我必须实际模拟 JSONObjectWithData 方法?

2 个答案:

答案 0 :(得分:2)

对于这个答案,我假设您实际上并不想模仿 getDictionaryFromData:方法。我假设你想测试它的实现,它是如何处理错误的情况。

您可以存根JSONObjectWithData:options:error:方法并在pass参数中返回错误;不知何故这样:

id serializerMock = [OCMock mockForClass:[NSJSONSerialization class]];
NSError *theError = /* create an error */
[[[serializerMock stub] andReturn:nil] JSONObjectWithData:data 
    options:NSJSONReadingAllowFragments error:[OCMArg setTo:theError]];

这里的诀窍显然是setTo:方法。

答案 1 :(得分:0)

这对我有用(OCMock 3):

id serializerMock = OCMClassMock(NSJSONSerialization.class);
    NSError *theError = [[NSError alloc] initWithDomain:NSCocoaErrorDomain code:NSPropertyListWriteInvalidError userInfo:nil];
    OCMStub(ClassMethod([serializerMock dataWithJSONObject:OCMOCK_ANY
                                                   options:0
                                                     error:[OCMArg setTo:theError]]));

注意:对于第[serializerMock dataWithJSONObject...]行,Xcode的代码完成不起作用。