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 中测试这个的正确方法是什么?我想做的是能够在测试中为“现在”硬编码一些值,这样我就可以尝试各种边缘情况。理想情况下,我想避免依赖测试中的当前时间和日期。

一种方法是修改我的方法以接受一个可选参数,该参数将覆盖它使用的“现在”值。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 回答