如何使用XCTAssertThrowsSpecific

owe*_*nfi 23 unit-testing objective-c nsexception ios xctest

我正在使用XCTest编写Cocoa单元测试,并且最近第一次使用了XCTAssertThrows.这很酷,但我想用XCTAssertThrowsSpecific让它变得更好,并且需要一定的异常.

这是一个示例测试:

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

在我的用户类中,我有以下代码:

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

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

    // go on to store the password on the keychain
}
Run Code Online (Sandbox Code Playgroud)

请记住,Cocoa通常不会使用异常(因此最好返回错误,并在前面的示例中显示UI等).如何以可被捕获的方式抛出异常XCTAssertThrowsSpecific?我如何指定XCTAssertThrowsSpecific(expression, specificException, format...)

Seb*_*ian 35

您应该仅对异常情况使用异常,而不是错误处理和流控制

话虽如此,这是你如何使用XCTAssertThrowsSpecific:

XCTAssertThrowsSpecific期望将异常的特定类作为第二个参数.NSCAssert抛出一个NSException.要测试它,请使用

XCTAssertThrowsSpecific([object methodThatShouldThrow], NSException, @"should throw an exception");
Run Code Online (Sandbox Code Playgroud)

现在,这无济于事,因为每个异常都可能是其中的一个NSException或一个子类.

NSExceptions具有name确定异常类型的属性.如果是NSCAssert这样的话NSInternalInconsistencyException.要测试它,请使用XCTAssertThrowsSpecificNamed

XCTAssertThrowsSpecificNamed(
  [object methodThatShouldThrow],
  NSException,
  NSInternalInconsistencyException,
  @"should throw NSInternalInconsistencyException"
);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,还有FYI XCTAssertThrowsSpecificNamed不在Swift 2.0中 (3认同)
  • 简而言之,因为Apple这样说:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Exceptions/Exceptions.html#//apple_ref/doc/uid/10000012-BAJGFBFB (3认同)