如何在类方法中模拟python的datetime.now()进行单元测试?
我正在尝试为具有以下方法的类编写测试:
import datetime
import pytz
class MyClass:
def get_now(self, timezone):
return datetime.datetime.now(timezone)
def do_many_things(self, tz_string='Europe/London'):
tz = pytz.timezone(tz_string)
localtime_now = self.get_now(tz)
...
return things
我想对其进行测试,因此我需要确保该datetime.datetime.now()
调用返回可预测的结果。
我一直在阅读许多在测试中使用Mock的示例,但找不到与我需要的东西完全一样的东西,而且我无法弄清楚如何在测试中使用它。
我将get_now()
方法分离出来,以防模拟起来更容易,而不是datetime.datetime.now()
,但是我仍然很困惑。关于如何使用Mock为此编写UnitTest的任何想法?(这一切都在Django中,fwiw;在这种情况下,我不确定这是否有所不同。)
-
您可以使用freezegun:
from freezegun import freeze_time def test(): assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) with freeze_time("2012-01-14"): assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) assert datetime.datetime.now() != datetime.datetime(2012, 1, 14)
它基本上
datetime
模拟了模块调用。