【问题标题】:Django Class-based view pass custom requestDjango 基于类的视图传递自定义请求
【发布时间】:2020-11-04 04:40:34
【问题描述】:

我在我的项目中使用unittest,下面是我的测试代码。

import unittest
from unittest.mock import patch, Mock
from lists.views import NewListView

@patch('lists.views.NewListForm')
class NewListViewUnitTest(unittest.TestCase):
    def setUp(self):
        self.request = HttpRequest()
        self.request.POST['text'] = 'new list item'
        self.request.user = Mock()
    def test_passes_POST_data_to_NewListForm(self, mockNewListForm):
        NewListView(self.request) # The important bit
        mockNewListForm.assert_called_once_with(data=self.request.POST)

我想传递一个自定义请求,如您所见,该请求包含一些 POST 数据。我最初有一个视图,所以我可以传递一个自定义请求。现在,使用基于类的视图,我该怎么做?我目前收到一条错误消息:

TypeError: __init__() takes 1 positional argument but 2 were given

我确实尝试过NewListView.as_view(self.request),但那是

TypeError: as_view() takes 1 positional argument but 2 were given

我知道您应该使用 Django 测试客户端并使用 URL 发出 POST 请求,而不是调用实际视图,但这是他们在我目前正在学习的书中的做法(Test-Driven Development with Python by Harry Percival。不幸的是,他似乎没有更新他的附录,他在那里教授基于类的视图的东西,所以我自己做。或者尝试。)

谢谢。

【问题讨论】:

  • 你不能使用 Django 的测试客户端发出一个虚拟请求吗?
  • 这本书就是这样做的。这种情况有很多,我只是展示了一个,这使得编辑变得困难。我想知道这是否可能。谢谢。
  • 也许这是可能的,但是,这不是正确的测试方法
  • 是的。但就像我说的,这本书是这样做的,而且实例太多,无法轻松编辑。
  • 这意味着使用测试客户端是一个集成测试,因为它涉及多个对象,这是一个单元测试。这有点傻,因为在现实世界中,没有人像这样进行单元测试,因为从 url 到视图、请求创建、后期处理的路径都由 Django 自己测试好。因此,无论出于何种意图和目的,它们都可以被视为一个单元。

标签: django testing python-unittest django-class-based-views


【解决方案1】:

你快到了。 as_view() 创建可以处理请求的 CBV 的功能视图版本:

@patch('lists.views.NewListForm')
class NewListViewUnitTest(unittest.TestCase):
    # ...
    def test_passes_POST_data_to_NewListForm(self, mockNewListForm):
        NewListView.as_view()(self.request)
        mockNewListForm.assert_called_once_with(data=self.request.POST)

【讨论】:

  • 谢谢。现在,根据回溯,我在 dispatch 方法中收到一条错误消息 AttributeError: 'NoneType' object has no attribute 'lower'。你能告诉我这意味着什么以及如何解决它吗?也许我应该在setUp 中设置request.method = ''
  • 我猜你应该将 request.method 设置为 'POST' 并提供 request.path 。你可以使用django.test.client.RequestFactory,但是你可能会做很多“集成的东西”。 :)
猜你喜欢
  • 2017-02-25
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2016-10-16
  • 2013-02-15
  • 2012-02-14
相关资源
最近更新 更多