1. ホーム
  2. django

[解決済み] Djangoで異なる設定でUnitテストを行うには?

2022-06-20 20:23:49

質問

ユニットテストの Django 設定をオーバーライドするための簡単なメカニズムはありますか? 私のモデルの1つに、最新のオブジェクトの特定の数を返すマネージャがあります。 返すオブジェクトの数は NUM_LATEST 設定で定義されています。

これは、誰かが設定を変更した場合に、私のテストを失敗させる可能性があります。 どのようにすれば setUp() で設定を上書きし、その後 tearDown() ? それが可能でない場合、私はメソッドをモンキーパッチまたは設定を模倣することができる何らかの方法がありますか?

EDITです。 以下は私のマネージャーコードです。

class LatestManager(models.Manager):
    """
    Returns a specific number of the most recent public Articles as defined by 
    the NEWS_LATEST_MAX setting.
    """
    def get_query_set(self):
        num_latest = getattr(settings, 'NEWS_NUM_LATEST', 10)
        return super(LatestManager, self).get_query_set().filter(is_public=True)[:num_latest]

マネージャは settings.NEWS_LATEST_MAX を使ってクエリセットをスライスします。 このとき getattr() は単に設定が存在しない場合のデフォルトを提供するために使用されます。

どのように解決するのですか?

編集: この回答は、(1) の設定を変更したい場合、(2) の設定を変更したい場合に適用されます。 小さい の数 特定 のテストを行います。

Django 1.4 からは、テスト中に設定を上書きする方法があります。 https://docs.djangoproject.com/en/stable/topics/testing/tools/#overriding-settings

TestCase には self.settings コンテキスト・マネージャがあり、さらに @override_settings デコレータも用意されており、テストメソッドあるいは TestCase サブクラス全体に適用できます。

これらの機能は Django 1.3 ではまだ存在しませんでした。

の設定を変更したい場合 全て の設定を変更したい場合、テストのために別の設定ファイルを作成し、メインの設定ファイルから設定をロードして上書きできるようにしたいと思うでしょう。他の回答でこれに対するいくつかの良いアプローチがあります; 私は両方の成功したバリエーションを見ました hspanderの dmitrii の のアプローチになります。