无法看到Django测试用例插入的记录
我正在尝试通过提交后钩子将我的django应用程序与subversion集成。
我有一个django测试用例(是unittest.TestCase的子类),它做了以下几件事:(a) 向一个表中插入几条记录,(b) 触发一个svn提交,(c) svn提交会运行一个钩子,这个钩子使用我的django模型来查找信息。
我使用的是sqlite3数据库。这个测试不是在内存数据库中运行,而是使用一个真实的文件。我修改了django测试代码(为了调试这个问题),让它在完成后不删除测试数据库,这样我就可以检查它。
测试代码在(a)和(b)之间打印了model.MyModel.objects.all(),记录确实存在。
但是当在(c)时钩子触发时,它也打印了模型,但没有记录。当我在测试运行后手动检查数据库时,发现里面没有记录。
难道django测试框架中发生了什么,导致记录没有提交到数据库文件吗?
为了澄清:在(d)结束测试用例。因此,svn提交钩子在测试用例结束之前运行,并且在任何django数据库清理代码应该运行之前。
额外信息:我在(b)和(b)之间添加了15秒的延迟,这样我可以在测试中间手动检查数据库文件。结果发现记录不在文件中。
3 个回答
我来得有点晚,但我在2022年使用Django 3.2和Python 3.8的时候也遇到了类似的问题,花了好几个小时在调试上。
如果你也遇到这个问题,可以检查一下你是否安装并配置了django-moderation。如果是的话,你可能需要在你的setUp函数中批准你添加的任何记录:
from django.test import TestCase
from myapp.models import MyModel
class ArbitraryTest(TestCase):
@classmethod
def setUpTestData(cls):
new_record = MyModel.objects.create(my_field="New Record")
new_record.save()
MyModel.moderated_object.fget(new_record).approve()
def test_function(self):
self.assertTrue(MyModel.objects.filter(my_field="New Record").count() > 0)
测试框架没有把数据保存到数据库里,测试结束后数据就被清除了。
你在使用Django的最新版本吗?最近的一些改动(变更集 9756)让测试在一个事务中运行,然后再回滚。这里是提交的评论:
修复了#8138 -- 将 django.test.TestCase改为在 数据库支持的情况下回滚测试, 而不是刷新和重新加载 数据库。这可以大大 减少运行大型测试套件所需的时间。