2017-04-11 251 views
0

我用UserPassesTestMixin保护了一个基于django类的视图。它的test_func接收一个名为division的参数,并检查当前用户是否是该部门的负责人。用django测试客户端测试UserPassesTestMixin

视图在网站中完美运行,但我一直无法写出成功的测试。似乎在client.get和test_func之间,用户正在消失。

我试过这与RequestFactory和客户端。我试过强迫登录。确保正确的中间件就位。

mixin的测试没有帮助我看到问题。 (https://github.com/django/django/blob/29f607927fe82e2c8baab171dfa8baf710cd9b83/tests/auth_tests/test_mixins.py

现在我陷入了无法测试UserPassesTestMixin保护的视图的各种角色。我很感激任何见解,为什么当我登录使用client.login(用户名='div1chair',密码='basicpassword'),在视图本身中有一个空的self.request.user

def test_permissions_to_access_division_summary_view(self): 
     """ 
     This test ensures that only department chairs and the division 
     director for the specific division detail can see the division 
     summary. 
     """ 
     url = "/division1" 

     client = Client() 
     client.login(username='div1chair', password='basicpassword') 

     # ipdb here confirms that div1chair is logged in 
     # ETA: ut oh. looks like this is not accurate. Now I'm really confused. client.login is giving False. 

     response = client.get(url,follow=True) 
     self.assertEqual(response.status_code, 200) # AssertionError: 404 != 200 

这是我测试的视图。

class DivisionDirectorView(UserPassesTestMixin, View): 

    def test_func(self):  

     division = Division.objects.get(short_name=self.kwargs['division']) 

     # ipdb here confirms that there is no user, or at least username is '' 
     if self.request.user == division.director: 
      return True 

     return False 

埃塔:这里是urls.py:

from django.conf.urls import url 
from fds.apps.professionalmetrics import views 

urlpatterns = [ 
    url(r'^$', views.metrics_default, name='metrics_default'), 
    # SNIP 
    url(r'(?P<division>[\w-]+)/$', 
     views.DivisionDirectorView.as_view(), 
     name='div-metric-summary'), 
    ] 

回答

0

test_funcdispatch方法是不寻常 - 在test_funcUserPassesTest混入不应带任何参数,除了self。我将简化test_func以下几点:

def test_func(self):  
    division = Division.objects.get(short_name=self.kwargs['division']) 
    return self.request.user == division.director 

那么你应该能够从dispatch方法删除自定义代码。

但是,我不确定这是否能解决您在测试中发现的问题。你没有显示你的网址,所以我不知道client.get(url, follow=True)是否应该返回200或预计404是否。您可以尝试设置follow = False并检查response

+0

谢谢,阿拉斯代尔!我已经按照你的建议简化了test_func代码,并且效果很好。我仍然不明白为什么当测试使用client.login(username ='div1chair',password ='basicpassword')登录时,视图本身有一个空的self.request.user。我附上了urls.py,尽管我的猜测是这不是。 test_func失败,因为self.request.user为空。我感谢您的评论! – robline

+0

你怎么知道'client.login(...)'成功了?你有没有检查过,以确保它返回“真”?我没有看到你的测试中的'/ division1'是如何匹配你发布的任何url。 – Alasdair

+0

就是这样!谢谢。问题是我需要强制登录。我早些时候尝试过,但不知怎的,它做错了。此外,道歉剔除urls.py的错误部分。我会更新这个问题,虽然事实证明,强迫登录解决它。 – robline