freeze_time 在调用的函数中不起作用
freeze_time doesn't work inside invoked functions
# test.py
from freezegun import freeze_time
from actual import DummyClass
class DummyClassMock(DummyClass):
def some_function(self):
# does something
class TestClass():
def setUp(self):
self.dummy = DummyClassMock()
@freeze_time('2021-01-01')
def test_dummy_function(self):
self.assertTrue((self.dummy.dummy_function - datetime.utcnow()).total_seconds() >= 1)
# actual.py
from datetime import datetime, timedelta
class DummyClass():
def dummy_function(self):
return datetime.utcnow() + timedelta(5)
我的代码遵循上述结构。有了这个,如果我单独执行 test_dummy_function
,dummy_function 将返回 2021-01-01 并且测试用例通过。但是,当我 运行 将其与项目中的所有其他测试用例一起使用时,它失败了。内容也不依赖。
不是特别好的解决方案,但是,我使用的解决方法是定义一个函数,该函数只 return datetime.utcnow()
并模拟它。我的测试用例会将 freeze_time 中使用的日期分配为 return 值。它看起来像,
@mock.patch(actual.DummyClass.now_function)
@freeze_time('2021-01-01')
def test_dummy_function(self, mock_dt):
now = datetime.utcnow()
mock_dt.return_value = now
self.assertTrue((self.dummy.dummy_function - now).total_seconds() >= 1)
# actual.py
Class DummyClass():
def now_function():
return datetime.utcnow()
def dummy_function():
return now_function()+timedelta(days=5)
# test.py
from freezegun import freeze_time
from actual import DummyClass
class DummyClassMock(DummyClass):
def some_function(self):
# does something
class TestClass():
def setUp(self):
self.dummy = DummyClassMock()
@freeze_time('2021-01-01')
def test_dummy_function(self):
self.assertTrue((self.dummy.dummy_function - datetime.utcnow()).total_seconds() >= 1)
# actual.py
from datetime import datetime, timedelta
class DummyClass():
def dummy_function(self):
return datetime.utcnow() + timedelta(5)
我的代码遵循上述结构。有了这个,如果我单独执行 test_dummy_function
,dummy_function 将返回 2021-01-01 并且测试用例通过。但是,当我 运行 将其与项目中的所有其他测试用例一起使用时,它失败了。内容也不依赖。
不是特别好的解决方案,但是,我使用的解决方法是定义一个函数,该函数只 return datetime.utcnow()
并模拟它。我的测试用例会将 freeze_time 中使用的日期分配为 return 值。它看起来像,
@mock.patch(actual.DummyClass.now_function)
@freeze_time('2021-01-01')
def test_dummy_function(self, mock_dt):
now = datetime.utcnow()
mock_dt.return_value = now
self.assertTrue((self.dummy.dummy_function - now).total_seconds() >= 1)
# actual.py
Class DummyClass():
def now_function():
return datetime.utcnow()
def dummy_function():
return now_function()+timedelta(days=5)