测试需要使用RequestFactory登录的Django视图

时间:2011-04-25 10:23:51

标签: python django unit-testing django-views

我是Django的新手,我想对需要用户登录的视图进行单元测试(@login_requred)。 Django提供了RequestFactory,理论上我可以直接调用该视图:

factory = RequestFactory()
request = factory.get("/my/home/url")
response = views.home(request)

但是,调用失败并带有

AttributeError: 'WSGIRequest' object has no attribute 'session'

显然,this is intentional,但是这会让我离开?如何测试需要身份验证的视图(在我的情况下是所有视图)?或者我完全采取了错误的方法?

我正在使用Django 1.3和Python 2.7。

2 个答案:

答案 0 :(得分:49)

使用RequestFactory时,您正在使用确切已知的输入测试视图。

这允许将测试与各种已安装的中间件组件执行的额外处理的影响隔离开来,从而更精确地进行测试。

您可以使用查看功能所需的任何其他数据设置请求,即:

    request.user = AnonymousUser()
    request.session = {}

我个人的建议是使用TestClient进行集成测试(即:整个用户结账流程包括许多步骤)和RequestFactory来测试独立的视图功能行为及其输出(即将产品添加到购物车)。

答案 1 :(得分:20)

正如@bmihelac所提到的,RequestFactory只测试已知输入(这意味着不包含中间件)。有关推理的详细信息,请阅读here。如果你想要一个空白会话,那么公认的解决方案很棒(我同意@dm03514客户端应该用于集成测试)。

但是,如果您仍想使用Django的SessionMiddleware(或任何中间件),您可以在测试中执行类似的操作(以下示例用于测试基于类的视图):

from django.contrib.sessions.middleware import SessionMiddleware
from django.test import TestCase, RequestFactory
from someapp.views import SomeView  # a Class Based View


class SomePageTest(TestCase):

    def setUp(self):
        self.factory = RequestFactory()

    def test_some_page_requires_session_middleware(self):
        # Setup
        request = self.factory.get('somepage.html')
        middleware = SessionMiddleware()
        middleware.process_request(request)
        request.session.save()

        response = SomeView.as_view()(request)

        self.assertEqual(response.status_code, 200)