0

我有一个可插入的 Django 应用程序,它提供了一些表单。表单有一些与它们相关联的设置,用于控制某些表单的行为(例如,标签、初始值等)。

我按照博客文章为可插入应用程序设置了默认设置,并且在正常情况下运行良好。但是,在我提供覆盖的测试中,根本不会应用覆盖。

这是其中一种形式的代码:

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

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

4

1 回答 1

0

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

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

settings.FORM_TO_USE = CurrencyForm

当您想实例化时,您可以执行以下操作:

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

最后,尝试将测试与配置分开管理。如果您正在对 django 进行单元测试,那么它不应该关心设置是什么。

于 2012-11-17T13:55:15.057 回答