2013-03-28 9 views

risposta

85

Sì. sys.exit solleva SystemExit, in modo da poter verificare con assertRaises:

with self.assertRaises(SystemExit): 
    your_method() 

istanze di SystemExit avere un attributo code che è impostato per lo stato di uscita proposto, e il direttore contesto restituito dal assertRaises ha l'istanza di eccezione intercettata come exception, in modo da controllare lo stato di uscita è facile:

with self.assertRaises(SystemExit) as cm: 
    your_method() 

self.assertEqual(cm.exception.code, 1) 

 

sys.exit Documentation:

Uscita da Python. Questo è implementato sollevando l'eccezione SystemExit ... è possibile intercettare il tentativo di uscita a un livello esterno.

+1

+1, eccetto che se vuole verificare che chiami 'sys.exit (1)' (al contrario di, per esempio, 'sys.exit (0)') devi effettivamente affermare che il suo 'codice' è 1. Immagino che potresti farlo con 'assertRaisesRegexp (SystemExit, '1')'? – abarnert

+0

Stavo proprio modificando quello in :) –

+0

Ero sicuro che esistesse un metodo 'unittest' che ti permettesse di passare un'eccezione e un predicato eseguibile _ per l'esecuzione sull'eccezione o sui suoi argomenti, piuttosto che solo un _regex pattern_ da eseguire sulla stringa rappresentazione del suo primo argomento ... ma immagino di no. C'è qualche altro modulo di test a cui sto pensando? – abarnert

5

Ecco un esempio operativo completo. Nonostante l'eccellente risposta di Pavel, mi ci è voluto un po 'per capirlo, quindi lo includo qui nella speranza che possa essere d'aiuto.

import unittest 
from glf.logtype.grinder.mapping_reader import MapReader 

INCOMPLETE_MAPPING_FILE="test/data/incomplete.http.mapping" 

class TestMapReader(unittest.TestCase): 

    def test_get_tx_names_incomplete_mapping_file(self): 
     map_reader = MapReader() 
     with self.assertRaises(SystemExit) as cm: 
      tx_names = map_reader.get_tx_names(INCOMPLETE_MAPPING_FILE) 
     self.assertEqual(cm.exception.code, 1) 
1

Come nota aggiuntiva alla risposta eccellente di Pavel si può anche verificare la presenza di stati specifici, se questi vengono forniti nella funzione si sta testando. Per esempio, se your_method() conteneva la seguente sys.exit("Error") sarebbe possibile testare per "errore" in particolare:

with self.assertRaises(SystemExit) as cm: 
    your_method() 
    self.assertEqual(cm.exception, "Error") 
1

ho trovato la risposta alla tua domanda nel Python Unit Testing documentation ricerca per "Test per Eccezioni". Usando il tuo esempio, il test unitario sarebbe il seguente:

self.assertRaises(SystemExit, your_function, argument 1, argument 2) 

Ricordarsi di includere tutti gli argomenti necessari per testare la propria funzione.

+0

grazie che ha funzionato perfettamente – sam

Problemi correlati