django - 在 Django 单元测试中使用 session 对象

标签 django session

我正在编写一个登录 View ,并想为该 View 添加单元测试。我的观点如下:

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)

单元测试崩溃,因为找不到 session 对象。我按照网站上的几个教程定义了一个虚拟 session 字典,但这没有帮助。

任何人都可以告诉我如何为需要处理 session 对象的 View 编写单元测试吗?

谢谢。

最佳答案

来自 RequestFactory 对象的文档:

It does not support middleware. Session and authentication attributes must be supplied by the test itself if required for the view to function properly.

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

关于django - 在 Django 单元测试中使用 session 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714585/

相关文章:

python - 启动交互式 shell 时导入

java - Web服务中的 session 管理?

ios - 尝试将应用程序导出为临时部署时,XCode 7.1 中的 session 已过期

php - 关于 session_destroy 的模糊性

javascript - 如何在浏览器窗口关闭时终止应用程序 session ?

python - 基于 Django 的网站的好方法,如果需要安装先决条件

python - Django 中的 URL 解析有两种模式

django - 如何使用 django 作为 cordova 的后端?

Django + Nginx + Uwsgi 查看Nginx默认页面然后运行在80端口

node.js - 如何在 NodeJS 上访问 socket.io 中的 cookie-session 中间件?