Как использовать XCTAssertThrowsSpecific

Я пишу модульные тесты Какао с использованием XCTest и недавно использовал XCTAssertThrows впервые. Это довольно круто, но я хочу сделать его еще лучше с XCTAssertThrowsSpecific и требует определенного исключения.

Вот пример теста:

-(void)testShortPassword {
    XCTAssertThrows([user storePassword:@"abc"],@"Expect exception for short pw");
}

И на моем пользовательском классе у меня есть следующий код:

-(void)storePassword:(NSString*)password {

    NSCAssert(password.length > 6, @"Password must be longer than 6 characters");

    // go on to store the password on the keychain
}

Помня о том, что Какао в целом избегает использования исключений (поэтому может быть лучше возвратить ошибку и показать пользовательский интерфейс в предыдущем примере и т. Д.) Как вывести исключение способом, который может быть перехвачен XCTAssertThrowsSpecific? Как мне указать это в XCTAssertThrowsSpecific(expression, specificException, format...)?

1 ответ

Решение

Вы должны использовать исключения только для исключительных случаев, а не для обработки ошибок и управления потоком

Сказав это, вот как вы используете XCTAssertThrowsSpecific:

XCTAssertThrowsSpecific ожидает специфический класс исключения в качестве второго параметра. NSCAssert бросает NSException, Чтобы проверить это, используйте

XCTAssertThrowsSpecific([object methodThatShouldThrow], NSException, @"should throw an exception");

Теперь, это не очень поможет, потому что вполне вероятно, что каждое исключение является NSException или его подкласс.

NSExceptionс name свойство, определяющее тип исключения. В случае NSCAssert это NSInternalInconsistencyException, Чтобы проверить это, используйте XCTAssertThrowsSpecificNamed

XCTAssertThrowsSpecificNamed(
  [object methodThatShouldThrow],
  NSException,
  NSInternalInconsistencyException,
  @"should throw NSInternalInconsistencyException"
);
Другие вопросы по тегам