2016-05-02 79 views
4

我有django應用程序與遺留數據庫5遺留下來。幾乎所有型號都使用元屬性managed=False進行設置。由於managed=False已設置,因此已使用選項managed=False創建了每個型號的遷移。而且,由於django測試運行器爲每個模型選擇現有的遷移以在test_databases中創建測試表,因此它不會創建任何內容。 我試圖創建test.py設置與以下解決文件:與幾個遺留數據庫測試django應用程序

from web_services.settings.dev import * 
from django.test.runner import DiscoverRunner 


class UnManagedModelTestRunner(DiscoverRunner): 

    def setup_test_environment(self, *args, **kwargs): 
     from django.apps import apps 
     self.unmanaged_models = [m for m in apps.get_models() if not m._meta.managed] 
     for m in self.unmanaged_models: 
      m._meta.managed = True 
     super(UnManagedModelTestRunner, self).setup_test_environment(*args, **kwargs) 

    def teardown_test_environment(self, *args, **kwargs): 
     super(UnManagedModelTestRunner, self).teardown_test_environment(*args, **kwargs) 
     # reset unmanaged models 
     for m in self.unmanaged_models: 
      m._meta.managed = False 

TEST_RUNNER = 'web_services.settings.test.UnManagedModelTestRunner' 

和運行python manage.py test --settings=web_services.settings.test。然而,它並沒有幫助,因爲無論如何 - 現有的遷移已經使用managed=False選項創建。只有在我的模型managed=False中註釋掉了,刪除了舊的遷移,創建了新的遷移(沒有managed=False選項)後,測試似乎才起作用。因此,我非常失落 - 在我的案例(多個遺留數據庫)中編寫測試的實際做法是什麼?處理調整遷徙的麻煩似乎是錯誤的。

回答

5

這是我現在如何解決我的問題。這與managed=False選項這個樣子的創建

遷移:

# migrations/0001_initial.py 
migrations.CreateModel(
      name='MyModel', 
      fields=[ 
       ('field_id', models.IntegerField(primary_key=True, serialize=False)), 
       ('slug', models.CharField(max_length=20, unique=True)), 
       ('name', models.CharField(max_length=64)), 
      ], 
      options={ 
       'db_table': 'MyModel', 
       'managed': False, 
      }, 
     ), 

人們需要註釋掉'managed': False以允許應用遷移。爲了不與實際遷移的一塌糊塗,我已經創建的文件夾test_migrations'managed': False註釋掉複製有我的遷移:

# test_migrations/0001_initial.py 
migrations.CreateModel(
      name='MyModel', 
      fields=[ 
       ('field_id', models.IntegerField(primary_key=True, serialize=False)), 
       ('slug', models.CharField(max_length=20, unique=True)), 
       ('name', models.CharField(max_length=64)), 
      ], 
      options={ 
       'db_table': 'MyModel', 
       # 'managed': False, 
      }, 
     ), 

然後,我們需要試運行期間參照這些遷移。爲此,我創建了設置文件test.py並提供了必要的參考。就像這樣:

from web_services.settings.dev import * 


MIGRATION_MODULES = { 
    'myapp': 'web_services.apps.myapp.test_migrations', 
} 

當運行測試時,需要指的是設置:

python manage.py test --settings=web_services.settings.test

+0

感謝。這一段時間我一直在th th。您的解決方案是唯一的解決方案(導入設置時出現問題,但也得到了解決方法) –

+0

儘管我不特別喜歡需要單獨備份遷移,但它是我唯一的工作解決方案到目前爲止發現。 – msonsona

+0

@AmirTugi謝謝你的回答。但是,如果你在sys.argv中加入'''if'test',你可以通過乾淨的方式來改善這個問題:'settings.py'中的這個'''this'MIGRATION_MODULES = { 'iop_bypass':'test_migrations', }好處是1.你不需要新的test_settings.py 2.你不需要運行額外的參數測試3.你沒有得到linting問題說你在PEP8中進行通配符導入 – Dinesh

相關問題