基于 Django Class 的视图传递自定义请求

Django Class-based view pass custom request

我在项目中使用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 数据。我本来有一个视图,所以我可以传递一个自定义请求。现在,有了基于 class 的视图,我该怎么做?我目前收到一条错误消息:

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 请求,而不是调用实际视图,但这是他们在我目前正在学习的书中的做法(Harry Percival 的 Python 测试驱动开发。不幸的是,他似乎没有更新他的附录,他在那里教授基于 class 的视图内容, 所以我自己做。或尝试。)

谢谢。

你快到了。 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)