【问题标题】:Django transaction test case raises IntegrityError with data migration on sqliteDjango 事务测试用例在 sqlite 上通过数据迁移引发 IntegrityError
【发布时间】:2014-12-13 16:05:18
【问题描述】:

我正在尝试将使用 LiveServerTestCase 进行测试的现有 django 1.6 项目移植到 django 1.7。我已将 initial_data 固定装置转换为数据迁移。当我这样做时,我的所有实时服务器测试都失败了,因为数据正在被刷新。然后我偶然发现了 TransactionTestCase 的 serialized_rollback 选项,并将其添加到我的测试类中。但是现在我在运行测试时遇到以下错误:

sqlite3.IntegrityError: UNIQUE constraint failed: django_content_type.app_label, django_content_type.model

我在此处的示例应用中复制了该问题:https://github.com/tctimmeh/djangomigrate

型号:

class SomeData(Model):
    value = IntegerField()

数据迁移:

def createData(apps, schema_editor):
    SomeData = apps.get_model('mtestapp', 'SomeData')
    db_alias = schema_editor.connection.alias
    SomeData.objects.using(db_alias).bulk_create([
        SomeData(value = 1),
    ])

class Migration(migrations.Migration):
    dependencies = [
        ('mtestapp', '0001_initial'),
    ]
    operations = [
        RunPython(createData)
    ]

还有测试:

class TestIt(TransactionTestCase):
    serialized_rollback = True
    def test_one(self):
        self.assertEqual(1, SomeData.objects.all().count())
    def test_two(self):
        self.assertEqual(1, SomeData.objects.all().count())

其中一项测试通过了。另一个引发了上述 IntegrityError。知道为什么会这样吗?

编辑:我对其进行了深入研究,看起来 django.contrib.contenttypes 应用程序有一个 post_migrate 管理命令,该命令在刷新测试数据库后运行。有没有办法阻止该命令运行?

【问题讨论】:

    标签: python django sqlite data-migration


    【解决方案1】:

    我在不同的情况下遇到了同样的问题。 我删除了serialized_rollback = True,并在 setUp() 方法中手动添加了测试数据。

    【讨论】:

      【解决方案2】:

      您需要add your application to available_apps 以便 Django 表现得好像只有该应用程序中的模型可用。在您的测试用例中,您有:

      class TestIt(TransactionTestCase):
        serialized_rollback = True
        available_apps = ['mtestapp']
      
        def test_one(self):
          self.assertTrue(True)
      
        def test_two(self):
          self.assertTrue(True)
      

      【讨论】:

        【解决方案3】:

        这在 Django 1.9 中已修复:https://code.djangoproject.com/ticket/23727

        对于早期版本,我通过重新创建静态数据作为每次测试的设置步骤来解决此问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-22
          • 2022-07-22
          • 2015-05-28
          • 2015-12-06
          • 1970-01-01
          • 2021-09-21
          • 2014-12-20
          • 1970-01-01
          相关资源
          最近更新 更多