ios objective-c unit-testing nsexception xctest

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...) ?