Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在保留其他方法的同时修补datetime的now方法?_Python_Python 2.7_Unit Testing_Mocking - Fatal编程技术网

Python 如何在保留其他方法的同时修补datetime的now方法?

Python 如何在保留其他方法的同时修补datetime的now方法?,python,python-2.7,unit-testing,mocking,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, moc

这是我想测试的功能

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
我认为它按预期的那样工作。然而,
补丁
也模仿了另一种方法
组合
。稍后我将从
my_func
获取此异常

BadValueError: Expected datetime, got <MagicMock name='datetime.combine().__add__()' id='4494328976'> 
但这意味着如果使用了
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()

演示:

这并不能回答您的问题,但我认为值得一提的是另一种方法。对于我的项目,我使用了

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()
from freezegun import freeze_time
import datetime

class SomeTest(TestCase):

    @freeze_time("2015-08-10 00:00:00")
    def some_test_case(self):
        print(datetime.now())

  2015-08-10 00:00:00