web-dev-qa-db-ja.com

XCTAssertThrowsSpecificの使用方法

私はXCTestを使用してCocoaユニットテストを作成しており、最近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は一般に、例外の使用を避けていることに注意してください(したがって、エラーを返し、前の例でUIを表示する方がよい場合があります)。XCTAssertThrowsSpecificがキャッチできる方法で例外をスローするにはどうすればよいですか? XCTAssertThrowsSpecific(expression, specificException, format...)でそれを指定するにはどうすればよいですか?

23
owenfi

例外は例外的な場合にのみ使用し、エラー処理やフロー制御には使用しないでください

そうは言っても、XCTAssertThrowsSpecificの使い方は次のとおりです。

XCTAssertThrowsSpecificは、例外の特定のクラスを2番目のパラメーターとして予期します。 NSCAssertNSExceptionをスローします。それをテストするには、

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

さて、すべての例外がNSExceptionまたはそのサブクラスである可能性が高いため、これはあまり役に立ちません。

NSExceptionsには、例外のタイプを決定するnameプロパティがあります。 NSCAssertの場合、これはNSInternalInconsistencyExceptionです。それをテストするには、XCTAssertThrowsSpecificNamedを使用します

XCTAssertThrowsSpecificNamed(
  [object methodThatShouldThrow],
  NSException,
  NSInternalInconsistencyException,
  @"should throw NSInternalInconsistencyException"
);
35
Sebastian