我正在运行一些需要手动调试的单元测试。 不知何故,在这些测试期间没有任何内容写入数据库。
有没有办法强制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()方法写入我的模型,直接将数据保存到数据库。
答案 0 :(得分:1)
从TransactionTestCase
而不是TestCase
对您的测试进行子类化,然后按预期保存/提交数据,以便您可以直接检查数据库中的数据。
每the docs:
Django的
除了方式之外,TestCase
类是一个更常用的子类 使用数据库事务的TransactionTestCase
设施,以加快重置数据库的过程 每个测试开始时的已知状态。结果如此, 但是,有些数据库行为无法在一个内部进行测试 DjangoTestCase
类。例如,你无法测试那块 代码在事务中执行,如使用时所需select_for_update()
。在这种情况下,你应该使用TransactionTestCase
。
TransactionTestCase
和TestCase
相同 其中数据库重置为已知状态和能力 测试代码以测试提交和回滚的效果:
- 测试运行后,
TransactionTestCase
会重置数据库 截断所有表格。TransactionTestCase
可以调用commit和 回滚并观察这些调用对数据库的影响。- 另一方面,
TestCase
在测试后不截断表。 相反,它将测试代码包含在数据库事务中 在测试结束时回滚。这保证了回滚 在测试结束时将数据库恢复到其初始状态。