Django测试可插拔应用程序和自定义设置

时间:2012-11-17 13:44:26

标签: django unit-testing settings

我有一个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)

显然,定义了时刻类,会立即应用标签和初始值等设置,因此覆盖对它们没有影响。

我最终得到了一个相当狡猾的解决方案来评估表单的__init__方法中的所有设置:

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=())

显然,很多活动部件。我对这段代码不太满意。如何在不诉诸这些黑客的情况下正确测试设置对表单的影响?

1 个答案:

答案 0 :(得分:0)

我不知道你想要做什么。但作为建议,您应该以更加面向对象的方式来思考。例如,您应该定义所有内容并插入您使用的内容,而不是使用if语句。

如果您有两个表单,并且每次都想使用其中一个表单,则可以进行一些设置,例如:

settings.FORM_TO_USE = CurrencyForm

当你想要实例化时,你可以这样做:

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

最后,尝试与配置分开管理测试。如果你正在测试django,它应该不关心设置是什么。