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)
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