2013-12-09 73 views
3

Django单元测试出现不一致的行为。在我使用sqlite的开发机器上,如果我分别在两个应用程序上运行测试,则测试会通过,但如果我运行manage.py test来一次测试所有内容,我会开始在两次测试中始终获得单元测试失败。与其他测试用例一起运行时,Django单元测试失败

在我的使用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上。

+1

究竟是什么错误? – e4c5

+0

没有看到整个单元测试,错误没有多大意义,但基本上测试失败说,应该在POST后创建的对象不存在。 – mathew

+0

@mathew你可以发布你的整个单元测试和完整的错误吗?您是否在使用django'TestCase'进行所有测试?你有泄漏数据吗? django的'TestCase'有什么好处呢,它可以在每次测试后擦干净你的数据库 – dm03514

回答

1

除了使用测试用例进行所有的测试,你需要确保你推倒这是在你的设置方法做任何补丁:

def setUp(self): 
    self.patcher = patch('my.app.module') 

def tearDown(self): 
    self.patcher.stop() 
1

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

在我的一个视图函数中,我使用的是Django send_mail()函数。在我的测试,而不是它的每一个我跑我的测试时间发邮件给我,我patchsend_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被导入之前我得到机会patch它。所以当我在我看来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: 
... 

这花了我很长时间来调试,所以我想我会分享我的解决方案。我希望它也适用于你。你可能不会使用嘲笑,在这种情况下这可能不会帮助你,但我希望它能帮助别人。

相关问题