我试图通过使用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管理命令,该命令在刷新测试数据库后运行。有没有办法阻止该命令运行?
答案 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
对于早期版本,我通过重新创建静态数据作为每个测试的设置步骤解决了这个问题。