2012-11-17 37 views
0

我有一個Django可插入應用程序,它提供了幾種形式。這些表單有幾個與它們相關的設置來控制一些表單的行爲(例如,標籤,初始值等)。Django測試可插入的應用程序和自定義設置

我按照blog post設置了可插拔應用程序的默認設置,這在正常情況下效果很好。但是,在我提供覆蓋的測試中,覆蓋不會得到應用。

下面是形式之一代碼:

if settings.CURRENCY_FORM_INCLUDE_EMPTY: 
    currencies.insert(0, (settings.CURRENCY_FORM_EMPTY_VALUE, 
          settings.CURRENCY_FORM_EMPTY_LABEL)) 

class CurrencyForm(forms.Form): 
    currency = forms.ChoiceField(
     required=False, 
     choices=currencies, 
     label=settings.CURRENCY_FORM_LABEL, 
     initial=settings.CURRENCY_FORM_INITIAL_VALUE) 

顯然,當下類的定義,如標籤和inital值設置立即生效,因此覆蓋對他們沒有影響。

我結束了在形式上的__init__方法評估所有設置的相當hackish的solugion:

class CurrencyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(CurrencyForm, self).__init__(*args, **kwargs) 

     choices = list(currencies) 

     if settings.CURRENCY_FORM_INCLUDE_EMPTY: 
      choices.insert(0, (settings.CURRENCY_FORM_EMPTY_VALUE, 
           settings.CURRENCY_FORM_EMPTY_LABEL)) 

     self.fields['currency'].label = settings.CURRENCY_FORM_LABEL 
     self.fields['currency'].choices = choices 
     self.fields['currency'].initial = kwargs.get(
      'initial', {} 
     ).get('currency', settings.CURRENCY_FORM_INITIAL_VALUE) 

    currency = forms.ChoiceField(required=False, 
           choices=()) 

顯然,大量的運動部件。我對這段代碼並不滿意。如何正確測試設置對錶單的影響而不訴諸這些黑客行爲?

回答

0

我不明白你想要做什麼。但作爲建議,您應該以更加面向對象的方式來思考。例如,不要使用那個if語句,您應該定義所有內容並插入您使用的內容。

如果你有2種形式,並且希望每次使用它們的1,你可以有一些設置,如:

settings.FORM_TO_USE = CurrencyForm 

而當你想要實例,你可以這樣做:

def my_view(request): 
    form = settings.FORM_TO_USE() 

最後,嘗試管理與配置分開的測試。如果你正在單元測試django,它不應該關心設置是什麼。

+0

我測試配置本身,因爲這是一個可插拔的應用程序。我想確保配置具有預期效果。 – hayavuk

相關問題