2016-05-31 14 views
0

Ich war Code Überprüfung einer API und ich fand dies in einem Komponententest. Der Test besteht, aber ich kann nicht verstehen warum.Django-Unit-Test - assertRaises funktioniert, wenn es nicht sollte

class SomeTestCase(TestCase): 

    def setUp(self): 
     self.client = Client() 

    @mock.patch("patch.a.thing", mock_function) 
    def test_fail(self): 
     request_data = { 
      "some": "bad data" 
     } 

     response = self.client.post(
      "/path/to/api", 
      json.dumps(request_data), 
      content_type="application/json", 
      HTTP_HEADERNAME=HEADER_VALUE 
     ) 

     self.assertRaises(Exception, response) 

Wir erwarten einen 500-Statuscode von der API, wie wir in schlechten Daten vorbei sind. Selbst wenn das Aufrufen der API eine Ausnahme auslösen würde, würde das während des client.post Gehäuses den Unit Test nicht auf Fehler bringen? response ist nicht aufrufbar und daher ist es falsch, es an assertRaises zu übergeben, aber das Verhalten, das ich erwarten würde, ist, dass assertRaises keine Ausnahme erhält und daher der Komponententest fehlschlägt. Kann jemand erklären, warum es sich so verhält?

Edit:

ich dies und das Unit-Test geht auch nur getestet:

self.assertRaises(Exception, self.client.post, 
     "/path/to/api", 
     json.dumps(request_data), 
     content_type="application/json", 
     HTTP_HEADERNAME=HEADER_VALUE 
) 

Es könnte klarer sein zu verwenden:

class ThingTestCase(TestCase): 

    def test_thing_fails(self): 
     x = True 
     y = False 
     z = {"some": "thing"} 

     self.assertRaises(Exception, x) 
     self.assertRaises(Exception, y) 
     self.assertRaises(Exception, z) 
     self.assertRaises(Exception) 
+0

Da Sie 'response = self.client.post (...)' * vor * Ihrer Behauptung aufrufen, sieht es so aus, als würde die erwartete Ausnahme nicht ausgelöst. Das deutet darauf hin, dass Ihre Monkey-Anpassung nicht funktioniert. – Alasdair

Antwort

1

Sie eine aufrufbare zu assertRaises passieren sollte es als Kontextmanager:

with self.assertRaises(Exception) 
    response = self.client.post(
     "/path/to/api", 
     json.dumps(request_data), 
     content_type="application/json", 
     HTTP_HEADERNAME=HEADER_VALUE 
    ) 

Im Moment wird self.assertRaises(Exception, response) versuchen, response aufrufen, die TypeError erhebt, weil es nicht abrufbar ist. Da Sie assertRaises mit Exception aufrufen, wird der Test bestanden. Es wird empfohlen, einen spezifischeren Fehler (z. B. ValueError) anstelle von Exception zu verwenden, um Probleme wie diese zu vermeiden. Zum Beispiel

x = True 
    self.assertRaises(ValueError, x) 

wird scheitern, weil x Aufruf TypeError aufwirft.

Verwandte Themen