【问题标题】:Why my testing function in the Django returns status code 404 while the page is shown correctly in the chrome browser?为什么我在 Django 中的测试函数在 chrome 浏览器中正确显示页面时返回状态码 404?
【发布时间】:2020-04-08 11:14:41
【问题描述】:

我是 Django 新手,我正在尝试进行一个简单的应用程序测试,并按照教程进行操作(simpleisbetterthancomplex)。其中一项测试失败,但我找不到原因。我添加了几张照片以清除发生了什么。

失败的测试函数是:

from django.core.urlresolvers import reverse
from django.urls import resolve
from django.test import TestCase
from .views import home, board_topics
from .models import Board

# some code here

class BoardTopicsTests(TestCase):
#....
    def test_board_topics_view_contains_navigation_links(self):
        board_topics_url = reverse('board_topics', kwargs={'pk': 1})
        print("49: board_topic = " + board_topics_url)
        homepage_url = reverse('home')
        print("51: homepage_url = " + homepage_url)
        new_topic_url = reverse('new_topic', kwargs={'pk': 1})
        print("53: new_topic_url = " + new_topic_url)
        response = self.client.get(board_topics_url)
        print("*****************\n")
        print(response)
        print('********************\n')
        self.assertContains(response, 'href="{0}"'.format(homepage_url))
        self.assertContains(response, 'href="{0}"'.format(new_topic_url))
#...

然后我可以看到输出:

Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.49: board_topic = /boards/1/
51: homepage_url = /
53: new_topic_url = /boards/1/new/
*****************

<HttpResponseNotFound status_code=404, "text/html">
********************

看来 board_topics_url 不起作用。但在我的 chrome 浏览器中,它工作得非常好,并返回一个包含两个链接 homepage_url = '/' 和 new_topic_url = '/boards/1/new/' 的页面:

 ...      
  <li class="breadcrumb-item"><a href="/">Boards</a></li>
  <li class="breadcrumb-item active">Django</li>
      </ol>

    <div class="mb-4">
        <a href="/boards/1/new/" class="btn btn-primary">New topic</a>
    </div>
...

两个链接都正常工作。

请问您知道有什么问题吗?非常感谢您的帮助。

【问题讨论】:

  • 欢迎来到 SO。在到达reverse('board_topics', kwargs={'pk': 1}) 之前,您是否先创建了Board(或任何您的模型名称)实例?
  • 嗨佩德拉姆。感谢您的关注。我已经在 models.py 文件中定义了 Board 类,它应该被正确地启动。上面的过程 (def test_board_topics_view_contains_navigation_links(self):) 是 test.py 文件的一部分,我只是调用“py manage.py test”(在 Windows 中)。在测试中,我相信请求是使用“self.client.get(board_topics_url)”发送的并存储到响应中。然而,响应是 404 状态失败。如果我在浏览器中请求 127.0.0.1.:8000//boards/1/ 它会正确显示。
  • 所以你并没有真正回答我的问题;只是为了更清楚地说明,django 为您的测试创建一个 empty 数据库,因此需要在测试之前创建对象(在您的情况下为 Board 对象)。您是否考虑到这一点?
  • 我相信我应该有一个记录,因为我有 'class BoardTopicsTests(TestCase): def setUp(self): Board.objects.create(name='First', description='First board.' ) '好吗?

标签: python django testing http-status-code-404


【解决方案1】:

在多次测试中,样本记录被反复创建和删除。因此 id 不是 1 而是更高的数字。检测当前记录的 ID 解决了这个问题:

    def test_board_topics_view_contains_navigation_links(self):
        boards_list = Board.objects.all()        #### added line
        board_topics_url = reverse('board_topics', kwargs={'pk': boards_list[0].id}) ### replaced 1 by boards_list[0].id
        homepage_url = reverse('home')
        new_topic_url = reverse('new_topic', kwargs={'pk': boards_list[0].id})  ### replaced 1 by boards_list[0].id
        response = self.client.get(board_topics_url)
        self.assertContains(response, 'href="{0}"'.format(homepage_url))
        self.assertContains(response, 'href="{0}"'.format(new_topic_url))

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2013-07-02
    • 2012-08-31
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多