我用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'),
]
谢谢,阿拉斯代尔!我已经按照你的建议简化了test_func代码,并且效果很好。我仍然不明白为什么当测试使用client.login(username ='div1chair',password ='basicpassword')登录时,视图本身有一个空的self.request.user。我附上了urls.py,尽管我的猜测是这不是。 test_func失败,因为self.request.user为空。我感谢您的评论! – robline
你怎么知道'client.login(...)'成功了?你有没有检查过,以确保它返回“真”?我没有看到你的测试中的'/ division1'是如何匹配你发布的任何url。 – Alasdair
就是这样!谢谢。问题是我需要强制登录。我早些时候尝试过,但不知怎的,它做错了。此外,道歉剔除urls.py的错误部分。我会更新这个问题,虽然事实证明,强迫登录解决它。 – robline