尝试模拟datetime.date.today(),但无法正常工作

发布于 2021-01-29 17:03:39

谁能告诉我为什么这不起作用?

>>> import mock
>>> @mock.patch('datetime.date.today')
... def today(cls):
...  return date(2010, 1, 1)
...
>>> from datetime import date
>>> date.today()
datetime.date(2010, 12, 19)

也许有人可以提出更好的方法?

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

    有一些问题。

    首先,您使用的方式mock.patch不太正确。当用作装饰器时,它
    仅在装饰函数内datetime.date.today用给定的Mock对象替换给定的函数/类(在这种情况下为)。因此,只有在您将是一个不同的功能,不会出现你想要的。
    __today()``datetime.date.today

    您真正想要的似乎是这样的:

    @mock.patch('datetime.date.today')
    def test():
        datetime.date.today.return_value = date(2010, 1, 1)
        print datetime.date.today()
    

    不幸的是,这行不通:

    >>> test()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "build/bdist.macosx-10.6-universal/egg/mock.py", line 557, in patched
      File "build/bdist.macosx-10.6-universal/egg/mock.py", line 620, in __enter__
    TypeError: can't set attributes of built-in/extension type 'datetime.date'
    

    失败是因为Python内置类型是不可变的-
    有关更多详细信息,请参见此答案。

    在这种情况下,我将自己子化datetime.date并创建合适的函数:

    import datetime
    class NewDate(datetime.date):
        @classmethod
        def today(cls):
            return cls(2010, 1, 1)
    datetime.date = NewDate
    

    现在您可以:

    >>> datetime.date.today()
    NewDate(2010, 1, 1)
    


知识点
面圈网VIP题库

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

去下载看看