2014-10-18 31 views
3

我想通過使用LiveServerTestCase到django 1.7的測試移植現有的django 1.6項目。我已將initial_data裝置轉換爲數據遷移。當我這樣做時,我所有的服務器測試都因爲數據被刷新而失敗。然後,我偶然發現了TransactionTestCase的serialized_rollback選項,並將其添加到我的測試類中。但是現在我發現了以下錯誤,當我運行我的測試:https://github.com/tctimmeh/djangomigrateDjango事務測試案例引發sqlite上的數據遷移IntegrityError

型號:

class SomeData(Model): 
    value = IntegerField() 

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

我在一個示例應用程序複製此問題數據遷移:

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

我在不同情況下遇到同樣的問題。 我刪除了serialized_rollback = True,並在setUp()方法中手動添加了測試數據。

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)