重新加载django模型以处理单元测试中的@override_settings

3 浏览
0 Comments

重新加载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")

0
0 Comments

在进行单元测试时,我将逻辑放入了模型中,并根据配置使测试的行为有所不同。因此,测试意识到了设置,并测试了正确的路径。虽然不是理想的解决方法,但由于应用程序缓存的存在,我找不到重新加载模型的方法。

为了解决这个问题,我还在模型的clean方法中添加了验证,如果配置要求,则会引发验证错误。

0
0 Comments

在进行单元测试时,我想在表单中使用设置。在我看来,这与模型无关。

实际上,在文档中指出,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,但既然它们在那里,我试图减少查看此特定条件的位置。

0