【发布时间】: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