我在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中测试这一点的正确方法是什么?我想做的是能够在测试中为"现在"硬编码一些值,这样我就可以尝试各种边缘情况。理想情况下,我希望避免在测试中依赖当前的时间和日期。
一种方法是修改我的方法以接受一个可选参数,该参数将覆盖它使用的"now"值。python是否有任何函数可以在不修改我的方法签名的情况下进行类似的操作?
您可以提取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()
...
并传递一个mock函数,其中包含测试所需的结果。
但如果你不想修改签名,可以使用补丁:
@patch.object(datetime, 'now')
def test_next_date(self, nowfunc):
nowfunc.return_value = ... # required result
# the rest of the test