作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
on_commit函数已添加到 Django 1.9,以便能够在当前事务提交后触发操作(例如 Celery 任务)。
他们稍后提到in the docs应该使用 TransactionTestCase
来测试依赖于该函数的特性。但是,与 TestCase
(使用事务并将其回滚)不同,TransactionTestCase
在每次测试后清空整个数据库。
不幸的是,我的数据迁移会在数据库中预加载一些有用的数据,这意味着在第一个测试清除数据库后,后续测试将不再有效。
我最终通过模拟 on_commit
诉诸于一个卑鄙的把戏:
with mock.patch.object(django.db.transaction, 'on_commit', lambda t: t()):
test_something()
有没有更好的办法?
最佳答案
只需继续使用 TestCase 和假提交强制执行 run_and_clear_commit_hooks 中推迟的操作。查看这篇文章:
https://medium.com/gitux/speed-up-django-transaction-hooks-tests-6de4a558ef96
关于python - 如何在不清除数据库的情况下测试 Django on_commit Hook ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42585224/
我读过 Django > 1.9 引入了 transaction.on_commit 以避免竞争条件。我知道 Django 默认将数据库自动提交设置为 true,因此每个查询都成为数据库级别的事务。
on_commit函数已添加到 Django 1.9,以便能够在当前事务提交后触发操作(例如 Celery 任务)。 他们稍后提到in the docs应该使用 TransactionTestCase
我是一名优秀的程序员,十分优秀!