2017-03-03 68 views
5

已将on_commit函数添加到Django 1.9中,以便能够在当前事务提交后触发操作(例如,Celery任务)。如何在不清除数据库的情况下测试Django on_commit挂钩?

他们稍后提到in the docs应该使用TransactionTestCase来测试依赖于该功能的功能。但是,与TestCase(使用事务并将其折回)不同,在每次测试后,TransactionTestCase会清空整个数据库。

不幸的是,我有数据迁移,它会在数据库中预加载一些有用的数据,这意味着在第一次测试清除数据库后,后续测试不再工作。

我结束了由嘲讽on_commit诉诸使坏:

with mock.patch.object(django.db.transaction, 'on_commit', lambda t: t()): 
    test_something() 

有没有更好的办法?

+3

其实你的解决办法是没有那么糟糕。我不想使用'TransactionTestCase',因为它对我的用例(大型'setUp'和大量的灯具)速度很慢。 – Palasaty

回答

0

我心里有两种可能性:

  1. 作为this节说,冲洗后post_migrate发出,这样你就可以进行预加载一些有用的数据
  2. 你也可以继承TransactionTestCase和实现_fixture_teardown(你可以看到,在方法的最后调用flush)。

如果你的迁移不太昂贵,如果是第二个,我可能会坚持第一个。

+0

使用'post_migrate'信号是一个好主意。我会看看我是否可以将数据迁移转换为此,因为它听起来总体上更清洁! –

相关问题