如何构造一个Error对象。 iOS版

时间:2015-02-10 15:36:50

标签: ios objective-c

目前正在使用Kiwi BDD框架为类编写测试单元。 以下是需要测试的方法:

- (SFErrorType)typeForError:(NSError *)error {
    NSError *innerError = error.userInfo[SFInnerErrorUserInfoKey];
    if (innerError) {
        return [self typeForError:innerError]; 
    }
    return SFErrorTypeUndefined;
}

方法属于SFErrorUtility类。 SFErrorType - 是一个“typedef NS_NUM”,它有两种类型 - SFErrorTypeUndefined和SFErrorTypeAlert。

SFInnerErrorUserInfoKey是一个NSString。

问题1.需要编写一个测试单元来测试该方法:

it(@" 6.6 should return [errorUtility typeForError:innerError] if innerError object can be created with userInfo - SFInnerErrorUserInfoKey", 
^{
    // something should be created here, probably an innerError object
    // my question is how to create this error object?  
    NSError *error = [NSError errorWithDomain: something code:nil userInfo:nil];

    [[errorUtility typeForError:error] should] equal: [errorUtility typeForError:innerError]]; 
    }
);

错误的对象包括:   NSError error = [NSError errorWithDomain:(NSString )代码:(NSInteger *)userInfo:(NSDictionary *)];

我们从方法实现中得到关于错误的“userInfo”参数的线索。但我不明白我们如何使用它来创建我们自己的错误对象。 我一般不明白这行代码会发生什么:

    NSError *innerError = error.userInfo[SFInnerErrorUserInfoKey];

问题2.我们通过向错误对象询问其“userInfo”字典来创建指针,我们问“你在”SFInnerErrorUserInfoKey“键下面有什么内容?”这是正确的吗?

问题3.最后一个问题,是不是“userInfo”字典是私有的(只读)?设备根据发生的任何错误自行构造“错误”对象。那么我们为它分配密钥怎么样,比如“SFInnerErrorUserInfoKey”?可能有一些我不理解的基本方面。

1 个答案:

答案 0 :(得分:0)

我建议您使用OCMock并执行以下操作:

id errorMock = [OCMockObject mockForClass:[NSError class]];
[[[errorMock stub] andReturn:@"YourErrorDomain"] domain];
[[[errorMock stub] andReturnValue:@1] code]; //some error code
[[[errorMock stub] andReturnValue:@{@"expectedKey":@"expectedValue"}] userInfo];    

[sut yourMethodFailWithError: errorMock];

希望这有帮助,因为我只是猜到了你的问题。