24

我正在使用 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...)

4

1 回答 1

35

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

话虽如此,以下是您的使用方式XCTAssertThrowsSpecific

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

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

现在,这不会有太大帮助,因为很可能每个异常都是它的一个NSException或一个子类。

NSExceptions 具有name确定异常类型的属性。在NSCAssert这种情况下是NSInternalInconsistencyException。要对此进行测试,请使用XCTAssertThrowsSpecificNamed

XCTAssertThrowsSpecificNamed(
  [object methodThatShouldThrow],
  NSException,
  NSInternalInconsistencyException,
  @"should throw NSInternalInconsistencyException"
);
于 2013-12-06T04:03:06.703 回答