ios - Cómo utilizar XCTAssertThrowsSpecific
objective-c unit-testing (1)
Solo debe usar excepciones para casos excepcionales, no para manejo de errores y control de flujo
Habiendo dicho eso, aquí tienes cómo usar XCTAssertThrowsSpecific
:
XCTAssertThrowsSpecific
espera la clase específica de la excepción como segundo parámetro. NSCAssert
lanza una NSException
. Para probar eso, use
XCTAssertThrowsSpecific([object methodThatShouldThrow], NSException, @"should throw an exception");
Ahora, eso no ayudará mucho, porque es probable que cada excepción sea una excepción NSException
o una subclase de la misma.
NSException
s tienen una propiedad de name
que determina el tipo de excepción. En el caso de NSCAssert
esto es NSInternalInconsistencyException
. Para probar eso, use XCTAssertThrowsSpecificNamed
XCTAssertThrowsSpecificNamed(
[object methodThatShouldThrow],
NSException,
NSInternalInconsistencyException,
@"should throw NSInternalInconsistencyException"
);
Estoy escribiendo pruebas de unidad de cacao usando XCTest y recientemente usé XCTAssertThrows por primera vez. Eso es bastante bueno, pero quiero hacerlo aún mejor con XCTAssertThrowsSpecific y que requiere una cierta excepción.
Aquí hay un ejemplo de prueba:
-(void)testShortPassword {
XCTAssertThrows([user storePassword:@"abc"],@"Expect exception for short pw");
}
Y en mi clase de usuario tengo el siguiente código:
-(void)storePassword:(NSString*)password {
NSCAssert(password.length > 6, @"Password must be longer than 6 characters");
// go on to store the password on the keychain
}
Teniendo en cuenta que, en general, Cocoa evita utilizar excepciones (por lo que podría ser mejor devolver un error y mostrar la IU en el ejemplo anterior, etc.) ¿Cómo puedo lanzar una excepción de una manera que pueda ser detectada por XCTAssertThrowsSpecific
? ¿Cómo especifico eso en XCTAssertThrowsSpecific(expression, specificException, format...)
?