2015-06-30 26 views
6

Django uygulaması yüklendiğinde kodu çalıştırmak için bir başlangıç ​​kancası olarak kullandığımız AppConfig.ready işlevinin davranışı için otomatik bir test yazmaya çalışıyoruz. Bizim ready yöntem uygulamamız, testimizde geçersiz kılmamız gereken bir Django ayarını kullanır ve doğal olarak bunu elde etmek için override_settings dekoratörünü kullanmaya çalışırız.Django: Geçersiz kılma AppConfig Hazır İşlevinde Kullanılan Ayar

Ancak bir sapma var - test çalıştırıldığında, ready işlevi çalıştırıldığında, ayar geçersiz kılma henüz başlatılmadı (hala orijinal değeri settings.py kullanıyor). Ayarı, ready işlevi çağrıldığında geçersiz kılma uygulanacak şekilde geçersiz kılmanın bir yolu var mı?

Bu davranışı göstermek için bazı kod:

settings.py

MY_SETTING = 'original value' 

dummy_app/__ init__.py

default_app_config = 'dummy_app.apps.DummyAppConfig' 

dummy_app/apps.py

from django.apps import AppConfig 
from django.conf import settings 


class DummyAppConfig(AppConfig): 
    name = 'dummy_app' 

    def ready(self): 
     print('settings.MY_SETTING in app config ready function: {0}'.format(settings.MY_SETTING)) 

dummy_app/tests.py

from django.conf import settings 
from django.test import TestCase 
from django.test.utils import override_settings 


@override_settings(MY_SETTING='overridden value') 
@override_settings(INSTALLED_APPS=('dummy_app',)) 
class AppConfigTests(TestCase): 

    def test_to_see_where_overridden_settings_value_is_available(self): 
     print('settings.MY_SETTING in test function: '.format(settings.MY_SETTING)) 
     self.fail('Trigger test output') 

Biz sadece iddia edilmektedir testler için bu ayarı geçersiz kılmaya dikkat etmek önemlidir

====================================================================== 
FAIL: test_to_see_where_overridden_settings_value_is_available (dummy_app.tests.AppConfigTests) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/labminds/venv/labos/src/dom-base/dummy_app/tests.py", line 12, in test_to_see_where_overridden_settings_value_is_available 
    self.fail('Trigger test output') 
AssertionError: Trigger test output 
-------------------- >> begin captured stdout << --------------------- 
settings.MY_SETTING in app config ready function: original value 
settings.MY_SETTING in test function: overridden value 

--------------------- >> end captured stdout << ---------------------- 

Çıktı ready'un davranışı, bu nedenle settings.py ayarını değiştirmeyi düşünmüyoruz ya da Bu dosyanın iyonu sadece otomatik testlerimizi çalıştırmak için kullanılır. Zaten kabul

Seçeneklerden biri - biz sadece bizim testinde AppConfig sınıf başlatmak ready diyoruz ve davranışını bu şekilde test etmek (hangi ayar dekoratör tarafından geçersiz olacağını işaret) olabilir. Bununla birlikte, bunu bir bütünleştirme testi olarak çalıştırmayı ve Django'nun bizim için işlevi çağırmak için doğal davranışına güvenmeyi tercih ediyoruz - bu bizim için önemli bir işlevdir ve Django'nun başlatma davranışı değiştiğinde testin başarısız olmasını sağlamak istiyoruz.

cevap

1

bazı fikirler (farklı sarfedilir ve otomatik güvencesi):

  • bütünleşmesi değil testini yapın ve releas notları okuyarak itimat/Django sürümünü yükseltmeden önce taahhüt ve/veya tek elle test
  • güvenmek
  • Bir test aşaması dağıtımı varsayımıyla - boru hattını yerleştiriniz, özel durumları izole olarak test edin ve bir yerleştirme dumanı testi olarak bir entegrasyon kontrolü ekleyin (örn: bu ayar değerini bir yönetim komutu veya dahili sadece url uç noktası üzerinden göstererek) - yalnızca evreleme için, evreleme için gereken değere sahip olduğunu doğrulayın. Birim testlerine kıyasla biraz gecikmeli geri bildirim
  • Django'nun kendi dışında bir test çerçevesi aracılığıyla test edin - örn.: unittest s (veya py.test s) yazıp
  • OS'nin çevre yoluyla ayarlarını geçersiz bir arada kullanın (eğer & ayarlarını manipüle aktarmak için bir yol gerekir gerçi) Her testte bu testlerin bootstrap django içindeki (biz envdir kullandım a'la 12 factor app) ve testi yapacağını bir yönetim komutu (ler) - örn: ben o
hiç denemedim ama MY_SETTING='overridden value' INSTALLED_APPS='dummy_app' EXPECTED_OUTCOME='whatever' python manage.py ensure_app_config_initialized_as_expected
  • , Django's own app init testsapps.clear_cache() ve with override_settings(INSTALLED_APPS=['test_app']): config = apps.get_app_config('test_app') assert config.... işe yarayabilir bakarak