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

在Django单元测试中使用会话对象,django,session,Django,Session,我正在编写一个登录视图,并希望为该视图添加一个单元测试。我的观点是这样的: def login(request): if request.POST: usrname = request.POST.get('username') password = request.POST.get('password') user = authenticate(username=usrname, password=password

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

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)
我的单元测试如下所示:

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

有人能为我解释一下如何为需要处理会话对象的视图编写单元测试吗


谢谢。

来自
RequestFactory
对象的文档:

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

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

像这样:
request.session={'num_visions':0}

这是您的确切代码吗?这一行有一个未关闭的字典
request=self.factory.post('/core/login',{“username”:“ValidUser1”,“password”:“12345”)
-它应该是
request=self.factory.post('/core/login',{“username”:“ValidUser1”,“password”:“12345”,})
是的,我是从回购协议中复制代码的。可能我在签入时输入了错别字。那么您是否仍能更正代码错误?