我不知道如何在单元测试的类中模拟/修补方法。我考虑以下解决方法:
class A():
def _get_datetime(self, days):
return (datetime.now() + timedelta(days=days)).strftime('%Y-%m-%d')
def do_something(self):
date = self._get_datetime()
现在我在单元测试中有以下TestClass:
class TestClass():
def test_one:
# do some things here
next_day = (datetime.now()).date()+relativedelta(days=+1)
self._test_a(self._mocked_get_datetime(next_day))
@patch('path.to.my.class.A', '_get_datetime')
def _test_a(self, mock_method):
self.env['A'].do_something()
def _mocked_get_datetime(self, date):
return date
如何模拟A类中的_get_datetime()
方法?
我想在测试环境中的A类的do_something()
方法中定义使用的日期。有可能吗?
谢谢!!
答案 0 :(得分:1)
这是使用patch.object模拟类_get_datetime
的{{1}}方法的单元测试解决方案
A
:
a.py
import datetime
from datetime import timedelta
class A():
def _get_datetime(self, days):
return (datetime.now() + timedelta(days=days)).strftime('%Y-%m-%d')
def do_something(self):
date = self._get_datetime()
return date
:
test_a.py
带有覆盖率报告的单元测试结果:
import unittest
from unittest.mock import patch
from datetime import datetime
from a import A
next_day = datetime.now().date()
class TestClass(unittest.TestCase):
@patch.object(A, '_get_datetime', return_value=next_day)
def test_do_something(self, mock_get_datetime):
a_instance = A()
actual = a_instance.do_something()
self.assertEqual(actual, next_day)
mock_get_datetime.assert_called_once()
if __name__ == '__main__':
unittest.main()
源代码:https://github.com/mrdulin/python-codelab/tree/master/src/stackoverflow/58857424