Подтвердить что ты не робот

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

Я пишу Cocoa модульные тесты, используя 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
}

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

4b9b3361

Ответ 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");