1

以下两个测试之一注定要失败,因为 @override_settings(....) 只在测试中执行一次。数据库被倒回以保持一致,但模型不会根据设置重新配置。所以如果默认设置为True,第二个testCaseFalse会失败,如果默认设置为False,testCaseTrue会失败。

我如何在以下代码中强制重新加载 Patient 模型,以便两个单元测试用例都可以工作。我希望这是我只需要在一个地方做的事情,而不是下面的 2 种注释掉的可能性,应该是某种干燥的方式并且仍然可以完成这项工作。

class Patient(models.Model):
    x = models.IntegerField(null=True, blank=not settings.REQUIRE_X_FOR_PATIENT)

class PatientForm(forms.ModelForm):
    #x = forms.CharField(required=settings.REQUIRE_X_FOR_PATIENT)  Don't want to have to do this
    class Meta:
        model = Patient

    #def __init__(self, *args, **kwargs):                   #Don't want to have to do this either
        #super(PatientForm, self).__init__(*args, **kwargs)
        #self.fields['x'].required = settings.REQUIRE_X_FOR_PATIENT

@override_settings(REQUIRE_X_FOR_PATIENT=True)
def testCaseTrue...
    form = PatientForm()
    self.assertTrue(form.fields['x'].required, "X should be required")

@override_settings(REQUIRE_X_FOR_PATIENT=False)
def testCaseFalse...
    form = PatientForm()
    self.assertTrue(form.fields['x'].required, "X should NOT be required")
4

2 回答 2

1

我只会使用表单中的设置。它似乎与我无关的模型。事实上,文档中指出空白选项仅用于验证:

请注意,这与 null 不同。null 纯粹与数据库相关,而空白与验证相关。如果一个字段有空白=真,表单验证将允许输入一个空值。如果某个字段的空白=False,则该字段将是必需的。

class Patient(models.Model):
    x = models.CharField(max_length...., blank=True)

class PatientForm(forms.ModelForm):
    x = forms.CharField(required=settings.REQUIRE_X_FOR_PATIENT)  
    class Meta:
        model = Patient

如果您仍然决定保留模型中的设置,您可以查看Chad Braun-Duin对此问题的回答。在我看来,仅仅进行一些测试是不值得的,它可能会破坏测试运行环境。

于 2013-04-22T23:41:14.623 回答
0

最后,我将逻辑放入模型中,然后根据配置进行不同的测试。于是测试就认识了设定,测试了正确的路径。不理想,但由于应用程序缓存,我发现无法重新加载模型。

我还在模型清理方法中添加了验证,如果配置需要它会引发验证错误。

于 2013-06-18T19:17:56.667 回答