问题 当测试运行时,Django测试数据库看起来是空的


我有一个使用本地PostgreSQL服务器的Django项目。 我正在使用调试器来调试我遇到的一些奇怪的错误。当调试器在其中一个测试中停止时,我试着查看测试数据库。我看到这个新数据库(test_project1),所有方案都按照它们的定义。但所有表都是空的。

我知道这些表不是空的: - 我使用了夹具,一些测试已经运行并返回数据。 - 后测试创建新用户返回201状态代码。

然而,当我尝试使用pgAdmin3或psql访问数据库时,我看不到任何数据。

知道这里发生了什么吗? Django是否使用某种复杂的现金机制?


3888
2018-04-28 20:38


起源



答案:


Django的 TestCase 是 将每个测试包装在自己的事务中。因此,只要您通过ORM执行请求,就不会使用您的数据库。


11
2018-04-29 05:38



谢谢。只是想确保我不会失去它...... :-) - Uzi
如果要禁用事务,可以暂时从TransactionTestCase而不是TestCase继承。这有点令人困惑:TestCase继承自TransactionTestCase,但“但是围绕着每个测试都有一个事务,猴子修补真正的事务管理例程什么都不做......”。这确实有效,并且对调试非常有用。是的,我有同样的,“我失去了吗?”时刻。您希望使用TestCase而不是TransactionTestCase的原因是回滚事务比截断表更快。 - Michael Bylstra


答案:


Django的 TestCase 是 将每个测试包装在自己的事务中。因此,只要您通过ORM执行请求,就不会使用您的数据库。


11
2018-04-29 05:38



谢谢。只是想确保我不会失去它...... :-) - Uzi
如果要禁用事务,可以暂时从TransactionTestCase而不是TestCase继承。这有点令人困惑:TestCase继承自TransactionTestCase,但“但是围绕着每个测试都有一个事务,猴子修补真正的事务管理例程什么都不做......”。这确实有效,并且对调试非常有用。是的,我有同样的,“我失去了吗?”时刻。您希望使用TestCase而不是TransactionTestCase的原因是回滚事务比截断表更快。 - Michael Bylstra