在 Django 单元测试中使用会话对象

Posted

技术标签:

【中文标题】在 Django 单元测试中使用会话对象【英文标题】:Using session object in Django unit test 【发布时间】:2013-01-20 19:06:31 【问题描述】:

我正在编写一个登录视图,并想为该视图添加一个单元测试。我的观点是这样的:

def login(request):

    if request.POST:
            usrname = request.POST.get('username')
            password = request.POST.get('password')
            user = authenticate(username=usrname, password=password)

            if user is not None:
                    auth_login(request, user)
                    return redirect('/core/home/')
            else:
                    context = 'error_message': "Invalid username or password"
                    return render(request, 'core/login.html', context)
    else:
            c = 
            c.update(csrf(request))
            return render_to_response('core/login.html',c)

def home(request):
    if request.user.is_authenticated():
        context = 'user' : request.user
        return render(request, 'core/home.html', context)
    else:
        return render(request, 'core/login.html')

我的单元测试看起来像这样:

class CoreViewTests(TestCase):
    def setUp(self):
            self.factory = RequestFactory()

    def test_login_view_with_valid_user(self):
            uf = UserFactory()
            user = uf.make_user("ValidUser1", "12345", "user@abc.com")
            self.assertEqual(user.username, "ValidUser1")
            request = self.factory.post('/core/login', "username": "ValidUser1", "password": "12345")
            response = login(request)
            self.assertEqual(response.status_code, 200)

单元测试崩溃,因为他们找不到会话对象。我通过定义一个虚拟会话字典来遵循网站上的几个教程,但它没有帮助。

谁能告诉我如何为需要处理会话对象的视图编写单元测试?

谢谢。

【问题讨论】:

这是您的确切代码吗?你在这条线上有一本未封闭的字典request = self.factory.post('/core/login', "username": "ValidUser1", "password": "12345") - 它应该是request = self.factory.post('/core/login', "username": "ValidUser1", "password": "12345",) 是的,我从 repo 中复制了我的代码。可能是我签到的时候打错了。 那么在更正了代码之后,你仍然得到错误吗? 【参考方案1】:

来自RequestFactory 对象的文档:

它不支持中间件。如果视图正常运行需要,会话和身份验证属性必须由测试本身提供。

如您所说,您可以尝试手动将 request.session 设置为包含适当内容的字典。不过,使用老式的Django test client 可能会更容易。

【讨论】:

【参考方案2】:

像这样: request.session = 'num_visits': 0

【讨论】:

以上是关于在 Django 单元测试中使用会话对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中使用不同的设置进行单元测试?

如何在 Django 单元测试中获取请求对象?

使用基于日期/时间的对象进行 Django 单元测试

Django 使用 ForeignKey 形成单元测试

单元测试应用程序生命周期事件

单元测试 django 内联表单集