在django单元测试期间,数据库仍为空

时间:2016-10-12 12:30:52

标签: django mariadb pytest

我正在运行一些需要手动调试的单元测试。 不知何故,在这些测试期间没有任何内容写入数据库。

有没有办法强制Django(或pytest?)在执行时直接提交更改,这样当我遇到断点时我实际上可以看到数据库中有什么内容?

my_object = SomeDefaultDjangoModel()
my_object.some_random_text = 'Just adding some data'
my_object.save()

foo = 'bar' <= Hitting breakpoint here.

对我的数据库执行手动SQL查询返回0行。 我怎样才能做到这一点?

*更新*

问题是Django不允许您在每个请求结束之前保存对数据库的更改,这在大多数情况下不是问题。 但是,当您想绕过ORM并使用原始连接执行查询时,它似乎为此启动了单独的数据库连接。由于所有事务处于待处理状态直到请求结束,因此无法从其他数据库连接访问这些更改。这将返回无效结果并使我的单元测试失败。

我还没有找到一种提交待处理事务的方法,所以我想我会开始将save_raw()方法写入我的模型,直接将数据保存到数据库。

1 个答案:

答案 0 :(得分:1)

TransactionTestCase而不是TestCase对您的测试进行子类化,然后按预期保存/提交数据,以便您可以直接检查数据库中的数据。

the docs

  

Django的TestCase类是一个更常用的子类   使用数据库事务的TransactionTestCase   设施,以加快重置数据库的过程   每个测试开始时的已知状态。结果如此,   但是,有些数据库行为无法在一个内部进行测试   Django TestCase类。例如,你无法测试那块   代码在事务中执行,如使用时所需   select_for_update()。在这种情况下,你应该使用   TransactionTestCase

     除了方式之外,

TransactionTestCaseTestCase相同   其中数据库重置为已知状态和能力   测试代码以测试提交和回滚的效果:

     
      
  • 测试运行后,TransactionTestCase会重置数据库   截断所有表格。 TransactionTestCase可以调用commit和   回滚并观察这些调用对数据库的影响。
  •   
  • 另一方面,TestCase在测试后不截断表。   相反,它将测试代码包含在数据库事务中   在测试结束时回滚。这保证了回滚   在测试结束时将数据库恢复到其初始状态。
  •