首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试模拟datetime.date.today(),但不起作用

尝试模拟datetime.date.today(),但不起作用
EN

Stack Overflow用户
提问于 2010-12-19 14:54:39
回答 17查看 128.1K关注 0票数 198

有人能告诉我为什么这个不起作用吗?

代码语言:javascript
复制
>>> 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)

也许有人能提出一个更好的方法?

EN

回答 17

Stack Overflow用户

发布于 2014-09-04 04:01:30

无论如何,模拟文档专门讨论了datetime.date.today,并且可以在不创建虚拟类的情况下实现这一点:

https://docs.python.org/3/library/unittest.mock-examples.html#partial-mocking

代码语言:javascript
复制
>>> from datetime import date
>>> with patch('mymodule.date') as mock_date:
...     mock_date.today.return_value = date(2010, 10, 8)
...     mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
...
...     assert mymodule.date.today() == date(2010, 10, 8)
...     assert mymodule.date(2009, 6, 8) == date(2009, 6, 8)
...
票数 143
EN

Stack Overflow用户

发布于 2013-11-18 02:29:23

我想我来得有点晚了,但我认为这里的主要问题是您直接为datetime.date.today打补丁,根据文档,这是错误的。

例如,您应该修补在被测试函数所在的文件中导入的引用。

假设您有一个functions.py文件,其中包含以下内容:

代码语言:javascript
复制
import datetime

def get_today():
    return datetime.date.today()

然后,在您的测试中,您应该有如下内容

代码语言:javascript
复制
import datetime
import unittest

from functions import get_today
from mock import patch, Mock

class GetTodayTest(unittest.TestCase):

    @patch('functions.datetime')
    def test_get_today(self, datetime_mock):
        datetime_mock.date.today = Mock(return_value=datetime.strptime('Jun 1 2005', '%b %d %Y'))
        value = get_today()
        # then assert your thing...

希望这会有一点帮助。

票数 39
EN

Stack Overflow用户

发布于 2011-03-26 03:28:12

添加到Daniel G's solution的步骤

代码语言:javascript
复制
from datetime import date

class FakeDate(date):
    "A manipulable date replacement"
    def __new__(cls, *args, **kwargs):
        return date.__new__(date, *args, **kwargs)

这将创建一个类,该类在实例化时将返回一个普通的datetime.date对象,但该对象也可以更改。

代码语言:javascript
复制
@mock.patch('datetime.date', FakeDate)
def test():
    from datetime import date
    FakeDate.today = classmethod(lambda cls: date(2010, 1, 1))
    return date.today()

test() # datetime.date(2010, 1, 1)
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4481954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档