python - 如何修补日期时间的 now 方法,同时保留其他方法?

标签 python python-2.7 unit-testing mocking

这是我要测试的功能

from datetime import datetime, timedelta, time
def my_func():
    result_date = datetime.combine(datetime.now(), time.min) + timedelta(days=look_forward)
    ...

这是我的单元测试代码

@patch('batch.mymodule.datetime')
def test_retrieve_data(self, mock_datetime):

   mock_datetime.now = Mock(return_value=datetime.datetime.strptime('Feb 14 2015', '%b %d %Y'))

   my_func

我认为它按预期工作。然而,patch 还模拟了其他方法combine。稍后我将从 my_func 获得此异常

BadValueError: Expected datetime, got <MagicMock name='datetime.combine().__add__()' id='4494328976'> 

我可以通过将其添加到单元测试来修复它:

mock_datetime.combine = datetime.datetime.combine

但这意味着我必须修补 datetime 中的每个单独方法(如果使用)。

有没有更好、更简单的替代方案?

最佳答案

定义 datetime.datetime 子类以将其用作模拟对象的类:

class MockDatetime(datetime.datetime):
    fake_now = None

    @classmethod
    def now(cls):
        return cls.fake_now


class TestFoo(unittest.TestCase):
    @patch('mod.datetime', MockDatetime)
    def test_retrieve_data(self):
        MockDatetime.fake_now = datetime.datetime(2015, 2, 14)
        my_func()

演示:http://asciinema.org/a/63nrqzrysunyeq76xl72f943k

关于python - 如何修补日期时间的 now 方法,同时保留其他方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34172627/

相关文章:

python - 如何从字符串中提取命令 - python

python - Python,我正在编码一个远程shell制造器,并继续遇到语法错误

java - 如何使用嵌套的for循环测试方法

visual-studio - 在 Visual Studio 2015 中显示单元测试的描述属性

unit-testing - 如何测试创建和注入(inject)依赖项的函数

python - 2D Game Engine 如何组织游戏对象?

Python:范围 for 循环。每5次做一些不同的事情

python - 如何从 Python 代码生成 PDF 报告。奥杜 16

python - 在只接受有效 UTF8 的系统上存储任意二进制数据

python - Pandas iterrows 将整数更改为 float