重新加载django模型以处理单元测试中的@override_settings
重新加载django模型以处理单元测试中的@override_settings
以下两个测试中的一个注定会失败,因为@override_settings(....)只会在测试过程中执行一次。数据库会被重置以保持一致,但是模型不会根据设置重新配置。因此,如果默认设置为True,则第二个testCaseFalse将会失败;如果默认设置为False,则testCaseTrue将会失败。\n在下面的代码中,如何强制重新加载Patient模型,以使两个单元测试用例都能正常工作?我希望这只需要在一个地方完成,而不是在下面被注释掉的两个可能性中进行选择,应该有一种DRY的方法来实现这个目标。\n
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) 不想这样做 class Meta: model = Patient #def __init__(self, *args, **kwargs): #也不想这样做 #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")
在进行单元测试时,我想在表单中使用设置。在我看来,这与模型无关。
实际上,在文档中指出,blank选项仅用于验证:
注意,这与null不同。null纯粹与数据库相关,而blank与验证相关。如果字段具有blank=True,则表单验证将允许输入空值。如果字段具有blank=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在这个问题的答案。在我看来,仅为了进行一些测试,这并不值得,而且很可能会破坏测试运行环境。
通过将其放在模型中,我可以在Django Admin中以及在这个表单中使用它。如果有人创建了另一个包含该模型的表单,也会在那里处理它,这就是我希望将其放在一个地方的原因。我经常想知道为什么Django开发者将表单逻辑放入模型中,比如blank=、verbose_name、help_text,但既然它们在那里,我试图减少查看此特定条件的位置。