无法看到Django测试用例插入的记录

6 投票
3 回答
1783 浏览
提问于 2025-04-15 13:16

我正在尝试通过提交后钩子将我的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 个回答

1

我来得有点晚,但我在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)
1

测试框架没有把数据保存到数据库里,测试结束后数据就被清除了。

5

你在使用Django的最新版本吗?最近的一些改动(变更集 9756)让测试在一个事务中运行,然后再回滚。这里是提交的评论:

修复了#8138 -- 将 django.test.TestCase改为在 数据库支持的情况下回滚测试, 而不是刷新和重新加载 数据库。这可以大大 减少运行大型测试套件所需的时间。

撰写回答