如何在类方法中模拟python的datetime.now()进行单元测试?

发布于 2021-01-29 17:23:06

我正在尝试为具有以下方法的类编写测试:

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;在这种情况下,我不确定这是否有所不同。)

关注者
0
被浏览
144
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用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模拟了模块调用。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看