【问题标题】:Django test client get returns 404 however works in shell and web browserDjango 测试客户端获取返回 404 但是在 shell 和 Web 浏览器中工作
【发布时间】:2018-07-19 16:37:36
【问题描述】:

请你帮帮我。我正在学习 Django 初学者课程 (https://github.com/sibtc/django-beginners-guide),无法弄清楚为什么示例中的测试用例总是返回错误 404,即使在 shell 或 Web 浏览器中运行良好。

我正在运行 Python 3.5.3,Django 版本:2.0.7

代码: url.py:

from django.contrib import admin
from django.urls import path
from boards import views as boards_views

urlpatterns = [
    path('', boards_views.home, name='home'),
    path('boards/<int:pk>/', boards_views.board_topics, name='board_topics'),
    path('admin/', admin.site.urls),
]

views.py:

from django.shortcuts import render, get_object_or_404
from .models import Board
# Create your views here.
def home(request):
    boards = Board.objects.all()
    return render(request, 'home.html', {'boards': boards})
def board_topics(request, pk):
    board = get_object_or_404(Board, pk=pk)
    return render(request, 'topics.html', {'board': board})

Tests.py:

from django.test import TestCase
from django.urls import resolve, reverse
from django.test.client import Client
from .views import home, board_topics
from .models import Board

# Create your tests here.
class BoardTopicsTests(TestCase):
    def setUp(self):
        Board.objects.create(name='Django', description='Django board.')

    def test_board_topics_view_success_status_code(self):
        url = reverse('board_topics', kwargs={'pk': 1})
        print('url = ' + str(url))
        response = self.client.get(url)
        self.assertEquals(response.status_code, 200)

这个测试总是返回 404 错误,即使我可以在这个测试中看到打印语句,DB 条目存在并且 url 是正确的。

谢谢!

【问题讨论】:

    标签: python django


    【解决方案1】:

    你确定创建的board的主键是1吗?

    class BoardTopicsTests(TestCase):
        def setUp(self):
            self.board = Board.objects.create(name='Django', description='Django board.')
    
        def test_board_topics_view_success_status_code(self):
            url = reverse('board_topics', kwargs={'pk': self.board.pk})
            response = self.client.get(url)
            self.assertEquals(response.status_code, 200)
    

    【讨论】:

      【解决方案2】:

      测试不一定会创建 pk=1 的 Board。您不应该对任何特定值进行硬编码;相反,保存创建的实例并使用它。

      def setUp(self):
          self.board = Board.objects.create(name='Django', description='Django board.')
      
      def test_board_topics_view_success_status_code(self):
          url = reverse('board_topics', kwargs={'pk': self.board.pk})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-08
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        相关资源
        最近更新 更多