gpt4 book ai didi

与其他测试用例一起运行时 Django 单元测试失败

转载 作者:行者123 更新时间:2023-12-03 00:44:47 26 4
gpt4 key购买 nike

我的 Django 单元测试行为不一致。在我使用 sqlite 的开发计算机上,如果我分别在两个应用程序上运行测试,则测试会通过,但如果我运行 manage.py test 一次测试所有内容,我开始在两个应用程序上一致地获得单元测试失败测试。

在使用 Postgres 的临时服务器上,我有一个特定的测试,该测试在单独测试时有效(例如 manage.py test MyApp.tests.MyTestCase.testSomething),但在运行整个测试时失败测试用例(例如 manage.py test MyApp.tests.TestCase)。

其他相关的 StackOverflow 问题似乎有两种解决方案:

  1. 使用 Django TestCase 代替 Python 的等效项
  2. 使用 TransactionTestCase 确保每次测试后正确清理数据库。

我都试过了,都没有用。出于沮丧,我也尝试使用 django-nose 代替,但我看到了同样的错误。我使用的是 Django 1.6。

最佳答案

我刚刚花了一整天的时间调试类似的问题。就我而言,问题如下。

在我的一个 View 函数中,我使用了 Django send_mail() 函数。在我的测试中,我没有在每次运行测试时都给我发送电子邮件,而是在我的测试方法中patch编辑了send_mail:

from mock import patch
...

def test_stuff(self):
...

with patch('django.core.mail.send_mail') as mocked_send_mail:

...

这样,在调用我的 View 函数后,我可以测试 send_mail 是否被调用:

self.assertTrue(mocked_send_mail.called)

单独运行测试时效果很好,但与套件中的其他测试一起运行时失败。失败的原因是,当它作为套件的一部分运行时,会事先调用其他 View ,从而导致加载 views.py 文件,从而导致send_mail 被导入< em>在我有机会修补它之前。因此,在我看来,当 send_mail 被调用时,调用的是实际的 send_mail,而不是我的修补版本。当我单独运行测试时,该函数在导入之前会被模拟,因此在加载 views.py 时,修补的版本最终会被导入。 mock documentation中描述了这种情况,我以前读过几次,但现在经过艰苦的学习后已经理解得很好了......

解决方案很简单:我没有修补 django.core.mail.send_mail,而是修补了已在我的 views.py 中导入的版本 - myapp.views.send_mail。换句话说:

with patch('myapp.views.send_mail') as mocked_send_mail:
...

这花了我很长时间来调试,所以我想我会分享我的解决方案。我希望它也适合你。您可能没有使用模拟,在这种情况下,这可能对您没有帮助,但我希望它会对某人有所帮助。

关于与其他测试用例一起运行时 Django 单元测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com