2010-07-21 8 views
12

Ich versuche, für eine Ausnahme zu testen.Unit Test Problem mit assertRaises

ich habe:

def test_set_catch_status_exception(self): 
    mro = self.mro 
    NEW_STATUS = 'No such status' 
    self.assertRaises(ValueError,mro.setStatus(NEW_STATUS)) 

Ich erhalte die folgende Fehlermeldung:

====================================================================== 
ERROR: test_set_catch_status_exception (__main__.TestManagementReviewGoalGetters) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "test_ManagementReviewObjective.py", line 68, in test_set_catch_status_exception 
    self.assertRaises(ValueError,mro.setStatus(NEW_STATUS)) 
    File "/Users/eric/Dropbox/ManagementReview.py", line 277, in setStatus 
    raise ValueError('%s is not in the list of allowed statuses: %s' % (status,LIST_OF_STATUSES)) 
ValueError: No such status is not in the list of allowed statuses: ['Concern or Delay', 'On Track', 'Off Track/Needs Attention'] 

---------------------------------------------------------------------- 

Dank

Antwort

29

self.assertRaises eine Funktion mro.setStatus, gefolgt von einer beliebigen Anzahl von Argumenten erwartet: in diesem Fall, nur NEW_STATUS. self.assertRaises assembliert seine Argumente in den Funktionsaufruf mro.setStatus(NEW_STATUS) innerhalb eines try...except Blocks, wodurch das ValueError erfasst und aufgezeichnet wird, falls es auftritt.

Passing mro.setStatus(NEW_STATUS) als Argument an self.assertRaises bewirkt, dass die ValueError vor self.assertRaises abfangen können auftreten es.

So ist das Update der Klammern auf ein Komma zu ändern:

self.assertRaises(ValueError,mro.setStatus,NEW_STATUS) 
+0

Das tat es! Vielen Dank. :) –

+0

@Eric: Kein Problem.  – unutbu

+0

Ich benutze Python 3.3 Interpreter in pycharm IDE. Was ist, wenn ich Argumente an die zu testende Funktion übergeben und eine Nachricht einfügen möchte, falls der gewünschte Fehler nicht auftritt? Beispiel - 'self.assertRaises (ValueError, person.set_age_method, -10," Fehler: Alter der Person kann nicht negativ sein. ")' Damit bekomme ich eine Ausnahme: 'set_age_method nimmt 2 Positionsargumente, aber 3 wurden gegeben'. Wie behebe ich das? Übrigens, die Dokumente für diese Behauptung sagen Ihnen nicht klar, wie es geht. https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises. Was ist ** kwds? – testerjoe2