2

使用外壳,我可以这样做:

>>> 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 appdjango 都会抱怨:
Could not import app.views. Error was: No module named debug
删除这个装饰器和导入语句允许它继续前进。

我非常迷茫,我需要 StackOverflow!感谢大家。

4

1 回答 1

2

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

我相信您在 shell 中尝试的命令是在普通数据库上运行的。当你运行你的文档测试时,Django 会建立一个测试数据库。当您运行文档测试时,您的用户似乎dev不在测试数据库中,因此登录尝试失败。User.objects.create_user一种选择是在您尝试登录之前创建用户。另一种选择是使用固定装置。

对于 Django,我建议编写单元测试而不是文档测试。一大优势是很容易包含将初始数据(例如用户)加载到测试数据库中的固定装置。另一个是 Django 负责在单元测试之间刷新数据库。

于 2012-02-21T23:58:34.163 回答