Domanda Come usare XCTAssertThrowsSpecific


Sto scrivendo i test unitari di Cocoa usando XCTest e recentemente ho usato XCTAssertThrows per la prima volta. È davvero bello, ma voglio renderlo ancora migliore con XCTAssertThrowsSpecific e richiedere una certa eccezione.

Ecco un esempio di test:

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

E sulla mia classe utente ho il seguente codice:

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

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

    // go on to store the password on the keychain
}

Tenendo presente che Cocoa in generale evita l'utilizzo di eccezioni (quindi potrebbe essere meglio restituire un errore e mostrare l'interfaccia utente nell'esempio precedente, ecc.) Come faccio a lanciare un'eccezione in un modo che può essere catturato da XCTAssertThrowsSpecific? Come posso specificarlo in XCTAssertThrowsSpecific(expression, specificException, format...)?


22
2017-12-06 03:28


origine


risposte:


Dovresti utilizzare le eccezioni solo per casi eccezionali, non per la gestione degli errori e il controllo del flusso

Detto questo, ecco come usi XCTAssertThrowsSpecific:

XCTAssertThrowsSpecific si aspetta la classe specifica dell'eccezione come secondo parametro. NSCAssert lancia un NSException. Per testarlo, usa

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

Ora, questo non aiuterà molto, perché è probabile che ogni eccezione sia un NSException o una sua sottoclasse.

NSExceptions hanno un name proprietà che determina il tipo di eccezione. In caso di NSCAssert questo è NSInternalInconsistencyException. Per testarlo, usa XCTAssertThrowsSpecificNamed

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

34
2017-12-06 04:03