简体   繁体   English

Django 测试在响应状态码 404 上抛出错误

[英]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:我正在关注有关 django 测试的讲座,这是其中一项测试:

    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:当我运行 manage.py 测试时,它在这个测试中抛出一个错误,基本上是说没有匹配的航班:

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.但这就是重点,没有带有该 ID 的航班,因此该请求的响应状态代码应等于 404。据我所知,我已经准确地从讲座中复制了代码,但讲师的测试都运行正常。 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?当我将预期的 response.status_code 更改为 200 self.assertEqual(response.status_code, 200)它给了我同样的错误,所以这向我表明主要问题在于响应行? Please let me know if there is anything more you need to see.如果您还有什么需要看的,请告诉我。

Your view class is not handling when the query resolves to nothing.当查询解析为空时,您的视图类未处理。 In django it's done as follows:django是这样完成的:

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

I've met the same problem.我遇到了同样的问题。 Indeed, it came from the response line or client.get() method itself.事实上,它来自响应行或 client.get() 方法本身。 In my case, I add "/" at the end of the quotation mark as:就我而言,我在引号的末尾添加了“/”,如下所示:

response = c.get(f"/flights/{max_id + 1}/")

And then check assert condition.然后检查断言条件。 Now it functions as I want.现在它可以按照我的意愿运行。

Also found that: If you substitute a word instead of a number as an invalid page, it works just fine.还发现:如果您将一个单词而不是数字替换为无效页面,则效果很好。 For example:例如:

THIS ONE OK (404 were detected):这一个 OK(检测到 404):

response = c.get(f"/flights/whatever")

THIS ONE DOESN'T WORK (404 were not detected and errors were alerted):这一个不起作用(未检测到 404 并警告错误):

response = c.get(f"flights/15")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM