Django测试在通用CreateView中的get_inital中的request.user失败

时间:2012-01-27 13:32:12

标签: django testing django-generic-views

我有一个像这样的通用视图:

class SaveView(CreateView):

    def get_initial(self):
        # Get the initial dictionary from the superclass method
        initial = super(SaveView, self).get_initial()
        # Copy the dictionary so we don't accidentally change a mutable dict
        initial = initial.copy()
        initial['user'] = self.request.user
        return initial

此视图包含login_required装饰器,因此self.request.user始终有效。

当我使用浏览器访问该页面时,一切正常,但我的测试失败了。我有以下测试设置:

from django.test import TestCase, client

class MyTest(TestCase):
    def setUp(self):
        self.client = client.Client()
    def test1(self):
        self.assertTrue(self.client.login(username='user1',password='password1'))
        data = {'name':'test 1'}
        response = self.client.post('/app/save/', data)
        self.assertEqual(response.status_code, 302)

'/ app / save /'是调用该视图的网址(它在浏览器上完美运行) 我的模型有2个必填字段“name”和“user”,所以这应该向创建的对象页面发出重定向,因为我已经通过数据传递了名称,用户应该从get_initial方法获得。

确实这就是“现实生活”中发生的事情,即浏览器。

我可以通过数据字典中的'user'成功传递此测试的唯一方法。

这是django.test模块中的错误还是这是预期的行为?为什么?

提前致谢

1 个答案:

答案 0 :(得分:1)

这是预期的行为。从关于初始数据的Django文档:

  

初始参数允许您指定在未绑定表单中呈现此字段时要使用的初始值。

在测试中发布数据时,您使用的是绑定表单,因此不使用初始数据。表单无效,因为缺少必需的user字段,因此返回200响应,显示表单错误。这与在浏览器中清除用户字段并提交表单时会发生的情况相同。

您需要将用户包含在post数据中,然后测试将通过。