2011-04-25 52 views
28

我是Django的新手,我想单元测试需要用户登录的视图(@login_requred)。 Django的好心提供了RequestFactory,我可以用理论上直接调用视图:测试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。

+0

我想Django测试客户端http://docs.djangoproject.com/en/dev/topics/testing/,应该是你正在寻找的。 – dm03514 2011-04-25 13:15:41

回答

46

使用RequestFactory时,您正在测试具有完全已知输入的视图。

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

可以与查看功能的附加数据建立请求期望,即:

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

我个人的建议是使用TestClient的做集成测试(即:在店整个用户结帐过程,包括许多步骤)和RequestFactory来测试独立的视图函数行为及其输出(即将产品添加到购物车)。

+0

AttributeError:'dict'对象没有'flush'属性Django 1.11' – 2017-10-16 11:59:57

14

正如@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)