2015-02-10 2 views
0

В настоящее время написание тестового модуля для класса с использованием инфраструктуры Kiwi BDD. Вот метод, который должен быть протестирован:Как создать объект Error. iOS

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

Метод относится к классу SFErrorUtility. SFErrorType - это «typedef NS_NUM», который имеет 2 типа: 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]]; 
    } 
); 

объект Error состоят из: NSError ошибки = [NSError errorWithDomain: (NSString) Код: (NSInteger *) USERINFO : (NSDictionary *)];

У нас есть ключ к реализации метода об ошибке «userInfo». Но я не понимаю, как мы можем использовать это, чтобы создать собственный объект ошибки. Я вообще не понимаю, что происходит в этой строке кода:

NSError *innerError = error.userInfo[SFInnerErrorUserInfoKey]; 

Вопрос 2. Мы создаем указатель, попросив об ошибке объекта его «USERINFO» словарь, которого мы спрашиваем «что у вас внутри под ключом «SFInnerErrorUserInfoKey»? »Это правильно?

Вопрос 3. Последний вопрос, не является ли пользовательский словарь закрытым (только для чтения)? Устройство самостоятельно строит объект «error», основываясь на любой ошибке. Почему мы назначаем для него ключи, такие как «SFInnerErrorUserInfoKey»? Возможно, есть какой-то фундаментальный аспект, который я не понимаю.

+0

Ваш вопрос непонятен. Вы спрашиваете, как передать «userInfo» одного экземпляра «NSError» на новый, который вы создаете? – rmaddy

+0

Объясните ур вопрос более подробно –

+0

Для тестового модуля мне нужно создать объект ошибки, потому что он передается в качестве аргумента для метода, который я тестирую. Чтобы создать объект ошибки, я собираю информацию из реализации метода. Первая строка кода в моем вопросе была из реализации метода. Это дает мне некоторое представление о том, как построить этот объект ошибки, который мне нужен, ключом является «userInfo». Я не понимаю, как я могу взять эту подсказку и создать автономный объект ошибки. –

ответ

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]; 

Надеется, что это помогает, потому что я только догадывался вашей проблема.

+0

Я должен использовать каркас Kiwi BDD. Теперь уверен, что я могу создать там объекты OCMock. –