我的 Django 单元测试行为不一致。在我使用 sqlite 的开发机器上,如果我分别在两个应用程序上运行测试,测试就会通过,但是如果我运行manage.py test
为了一次测试所有内容,我开始在两次测试中一致地获得单元测试失败。
在我使用 Postgres 的临时服务器上,我有一个特定的测试,可以在单独测试时起作用(例如manage.py test MyApp.tests.MyTestCase.testSomething
),但在运行整个测试用例时失败(例如manage.py test MyApp.tests.TestCase
).
其他相关的StackOverflow问题似乎有两种解决方案:
- 使用 Django TestCase 代替 Python 的等效项
- 使用 TransactionTestCase 确保每次测试后正确清理数据库。
我两种方法都试过了,都没有用。出于沮丧,我也尝试使用 django-nose 代替,但我看到了同样的错误。我使用的是 Django 1.6。
我刚刚花了一整天的时间调试类似的问题。就我而言,问题如下。
在我的视图函数之一中,我使用了 Djangosend_mail()
功能。在我的测试中,我没有让它在每次运行测试时向我发送电子邮件,而是patch
ed send_mail
在我的测试方法中:
from mock import patch
...
def test_stuff(self):
...
with patch('django.core.mail.send_mail') as mocked_send_mail:
...
这样,在调用我的视图函数后,我可以测试它send_mail
被调用:
self.assertTrue(mocked_send_mail.called)
这在单独运行测试时工作正常,但在与套件中的其他测试一起运行时失败。失败的原因是,当它作为套件的一部分运行时,其他视图会被提前调用,从而导致views.py
文件被加载,导致send_mail
待进口before我有机会patch
它。所以当send_mail
在我看来,这是实际的send_mail
被调用的,不是我的修补版本。当我单独运行测试时,该函数被嘲笑before它是导入的,因此修补版本最终会在以下情况下导入:views.py
已加载。这种情况在模拟文档以前读过几遍,但现在经过艰苦的学习后已经明白了......
解决方案很简单:而不是打补丁django.core.mail.send_mail
我刚刚修补了已导入的版本views.py
- myapp.views.send_mail
。换句话说:
with patch('myapp.views.send_mail') as mocked_send_mail:
...
这花了我很长时间来调试,所以我想我会分享我的解决方案。我希望它也适合你。您可能没有使用模拟,在这种情况下,这可能对您没有帮助,但我希望它会对某人有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)