Search code examples
pythondjangodjango-testingdjango-tests

Django test throwing an error on response status code 404


I'm following along with a lecture on django testing and this is one of the tests:

    def test_invalid_flight_page(self):
        max_id = Flight.objects.all().aggregate(Max("id"))["id__max"]

        c = Client()
        response = c.get(f"/flights/{max_id + 1}")
        self.assertEqual(response.status_code, 404)

When I run manage.py tests it throws an error on this test, essentially saying there is no matching flight:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.......E..
======================================================================
ERROR: test_invalid_flight_page (flights.tests.FlightTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\sarah\Desktop\airline\flights\tests.py", line 68, in test_invalid_flight_page
    response = c.get(f"/flights/{max_id + 1}")
  File "C:\Python\Python385\lib\site-packages\django\test\client.py", line 732, in get
    response = super().get(path, data=data, secure=secure, **extra)
  File "C:\Python\Python385\lib\site-packages\django\test\client.py", line 393, in get
    return self.generic('GET', path, secure=secure, **{
  File "C:\Python\Python385\lib\site-packages\django\test\client.py", line 470, in generic
    return self.request(**r)
  File "C:\Python\Python385\lib\site-packages\django\test\client.py", line 709, in request
    self.check_exception(response)
  File "C:\Python\Python385\lib\site-packages\django\test\client.py", line 571, in check_exception
    raise exc_value
  File "C:\Python\Python385\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Python\Python385\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\sarah\Desktop\airline\flights\views.py", line 21, in flight
    flight = Flight.objects.get(pk=flight_id)
  File "C:\Python\Python385\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Python\Python385\lib\site-packages\django\db\models\query.py", line 429, in get
    raise self.model.DoesNotExist(
flights.models.Flight.DoesNotExist: Flight matching query does not exist.

----------------------------------------------------------------------
Ran 10 tests in 0.120s

FAILED (errors=1)
Destroying test database for alias 'default'...

But that is the point, there is no flight with that id so the response status code for that request should equal 404. As far as I can see I have copied the code accurately from the lecture but the lecturer's tests are all running okay. Can anyone see what I may be missing?

When I change the expected response.status_code to 200 self.assertEqual(response.status_code, 200) it gives me the same error so this indicates to me that the main problem lies with the response line? Please let me know if there is anything more you need to see.


Solution

  • Your view class is not handling when the query resolves to nothing. In django it's done as follows:

    try:
        result = SomeModel.objects.get(pk=some_id)
    except SomeModel.DoesNotExist:
        # Return 404 here