2013-03-28 11 views

Odpowiedz

85

Tak. sys.exit podnosi SystemExit, więc można sprawdzić je assertRaises:

with self.assertRaises(SystemExit): 
    your_method() 

Przypadki SystemExit mieć atrybut code który jest ustawiony na proponowanym statusu wyjścia, a kierownik kontekst zwrócony przez assertRaises ma złowionych wystąpienie wyjątku jako exception, więc sprawdzenie stanu wyjścia jest łatwe:

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

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

 

sys.exit Documentation:

Wyjdź z Python. Jest to realizowane przez podniesienie wyjątku SystemExit ... możliwe jest przechwycenie próby wyjścia na poziomie zewnętrznym.

+1

+1, z tym wyjątkiem, że jeśli chce zweryfikować, że wywołuje 'sys.exit (1)' (w przeciwieństwie do, powiedzmy, 'sys.exit (0)') musisz faktycznie potwierdzić, że jego 'code' jest 1. Zgaduję, że możesz to zrobić z 'assertRaisesRegexp (SystemExit, '1')'? – abarnert

+0

Właśnie edytowałem to w :) –

+0

Byłem pewien, że istniała metoda "unittest", która pozwala ci przekazać wyjątek i _callable predicate_ do uruchomienia na wyjściu lub jego args, a nie tylko _regex pattern_ do uruchomienia na łańcuchu reprezentacja jego pierwszego argumentu ... ale chyba nie. Czy jest jakiś inny moduł testowy, o którym myślę? – abarnert

5

Oto pełny przykład pracy. Pomimo doskonałej odpowiedzi Pavela zajęło mi trochę czasu, aby to zrozumieć, więc włączam ją tutaj w nadziei, że będzie pomocna.

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

Jako dodatkową uwagę do doskonałej odpowiedzi Pavela możesz również sprawdzić, czy nie ma określonych statusów, jeśli są one dostarczane w testowanej funkcji. Na przykład jeśli your_method() zawierał następujące sys.exit("Error") byłoby możliwe do testowania „Błąd” w szczególności:

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

znalazłem odpowiedzi na swoje pytanie w poszukiwaniu Python Unit Testing documentation dla „Testowanie wyjątki”. Na podstawie tego przykładu test jednostki będzie wyglądał następująco:

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

Pamiętaj, aby dołączyć wszystkie argumenty potrzebne do przetestowania funkcji.

+0

dzięki, że działało idealnie – sam

Powiązane problemy