使用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!感谢大家。
答案 0 :(得分:2)
sensitive_post_parameters
是Django 1.4中的一个新功能,所以如果您运行Django 1.3或更早版本,则导入将失败。
我相信您在shell中尝试的命令是在普通数据库上运行的。当您运行doc测试时,Django将设置一个测试数据库。运行doc测试时,用户dev
看起来不在测试数据库中,因此登录尝试失败。一种选择是在尝试登录之前使用User.objects.create_user
创建用户。另一个选择是使用灯具。
使用Django,我建议编写单元测试而不是doc测试。一个很大的优点是可以很容易地包含夹具以将初始数据(例如用户)加载到测试数据库中。另一个是Django负责在单元测试之间刷新数据库。