Django事务测试用例通过sqlite上的数据迁移引发了IntegrityError

时间:2014-10-18 02:33:47

标签: python django sqlite data-migration

我试图通过使用LiveServerTestCase到django 1.7的测试来移植现有的django 1.6项目。我已将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管理命令,该命令在刷新测试数据库后运行。有没有办法阻止该命令运行?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您需要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)

答案 2 :(得分:0)

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

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