Django测试运行器和测试客户端使用身份验证后端登录的问题

时间:2012-02-21 23:07:27

标签: django django-testing

使用shell,我可以这样做:

>>> from django.test.client import Client
>>> from django.test.utils import setup_test_environment
>>> setup_test_environment()
>>> c = Client()
>>> c.login(username="dev", password="password")
True
>>> r = c.get('/')
>>> r.status_code
200

现在在test.py文件中使用它:

from django.test.client import Client

__test__ = {"doctest": """
>>> c = Client()
>>> c.login(username='dev', password='password')
True
>>> r = c.get('/')
>>> r.status_code
200
"""}

我得到了这个输出:

Failed example:
    c.login(username="dev", password="password")
Expected:
    True
Got:
    False
------------------------------------------------------
Failed example:
    r.status_code
Expected:
    200
Got:
    302

我看过整个互联网,我找不到任何有助于这种情况的东西。有什么想法吗?

在类似的说明中,我已经注释掉了from django.views.decorators.debug import sensitive_post_parameters以及我的代码中的所有@sensitive_post_parameters()装饰器,因为每次我运行./manage.py test app django抱怨:
Could not import app.views. Error was: No module named debug
删除此装饰器和导入语句允许它向前移动。

我非常失落,我需要StackOverflow!感谢大家。

1 个答案:

答案 0 :(得分:2)

sensitive_post_parameters是Django 1.4中的一个新功能,所以如果您运行Django 1.3或更早版本,则导入将失败。

我相信您在shell中尝试的命令是在普通数据库上运行的。当您运行doc测试时,Django将设置一个测试数据库。运行doc测试时,用户dev看起来不在测试数据库中,因此登录尝试失败。一种选择是在尝试登录之前使用User.objects.create_user创建用户。另一个选择是使用灯具。

使用Django,我建议编写单元测试而不是doc测试。一个很大的优点是可以很容易地包含夹具以将初始数据(例如用户)加载到测试数据库中。另一个是Django负责在单元测试之间刷新数据库。