0

私は、現在の時刻を基準にして計算を行うdjangoモデルのメソッドを持っています。ここにスニペットがあります:

def next_date():
    now = datetime.now()
    trial_expires = max(self.date_status_changed + timedelta(self.trial_days), now)
    return timezone.datetime(trial_expires.year, trial_expires.month+1, 1, tzinfo=trial_expires.tzinfo)

unittestを使用してdjango/pythonでこれをテストする適切な方法は何ですか? 私がやりたいのは、テストで「今」の値をハードコーディングできるようにして、さまざまなエッジケースを試すことができるようにすることです。理想的には、テストで現在の日時に依存することは避けたいと思います。

1 つのアプローチは、使用する「現在」の値をオーバーライドするオプションのパラメーターを受け入れるようにメソッドを変更することです。Python には、メソッド シグネチャを変更せずに同様のことを行う関数はありますか?

4

1 に答える 1

1

パラメータとして抽出できdatetime.now()ます:

def next_date(nowfunc=datetime.now):
    now = nowfunc()
    ...

またはクラスの依存関係として:

class X:
    def __init__(self, nowfunc=datetime.now):
        self._nowfunc = nowfunc

def next_date(self):
    now = self._nowfunc()
    ...

そして、テストから必要な結果を含むモック関数を渡します。

ただし、署名を変更したくない場合は、パッチを使用してください。

@patch.object(datetime, 'now')
def test_next_date(self, nowfunc):
    nowfunc.return_value = ... # required result
    # the rest of the test
于 2012-08-31T09:18:40.683 に答える