1

@override_settings(....) はテストで 1 回しか実行されないため、以下の 2 つのテストの 1 つが失敗する運命にあります。データベースは一貫性が保たれるように巻き戻されますが、モデルは設定に基づいて再構成されません。したがって、デフォルト設定が True の場合、2 番目の testCaseFalse は失敗し、デフォルト設定が False の場合、testCaseTrue は失敗します。

次のコードで、両方の単体テスト ケースが機能するように、Patient モデルを強制的に再読み込みする方法を教えてください。これは、以下の 2 つのコメントアウトされた可能性ではなく、1 つの場所でのみ実行する必要があるものにしたいと考えています。DRY でありながら、これを達成するための何らかの方法である必要があります。

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 は純粋にデータベース関連であり、空白は検証関連です。フィールドに 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によるこの質問への回答を確認できます。私の意見では、一部のテストだけでは価値がなく、テスト実行環境が壊れる可能性があります。

于 2013-04-22T23:41:14.623 に答える
0

最後に、ロジックをモデルに入れ、構成に応じてテストの動作を変えました。したがって、テストは設定を認識するようになり、正しいパスがテストされました。理想的ではありませんが、アプリのキャッシュのためにモデルをリロードする方法が見つかりませんでした。

また、モデルの clean メソッドに検証を追加し、構成で必要な場合は検証エラーを発生させました。

于 2013-06-18T19:17:56.667 に答える