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