是否可以修补在另一个 class 中调用的方法?
Is it possible to patch a method that is invoked in another class?
我不知道如何在单元测试中 mock/patch class 中的方法。我考虑以下解决方法:
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
如何模拟 class A 中的 _get_datetime()
方法?
我想在我的测试环境中定义 class A 中 do_something()
方法中使用的日期。这可能吗?
谢谢!!
这是使用patch.object模拟class_get_datetime
方法的单元测试解决方案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()
包含覆盖率报告的单元测试结果:
(venv) ☁ python-codelab [master] ⚡ coverage run /Users/ldu020/workspace/github.com/mrdulin/python-codelab/src/Whosebug/58857424/test_a.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(venv) ☁ python-codelab [master] ⚡ coverage report -m
Name Stmts Miss Cover Missing
--------------------------------------------------------------------
src/Whosebug/58857424/a.py 8 1 88% 7
src/Whosebug/58857424/test_a.py 13 0 100%
--------------------------------------------------------------------
TOTAL 21 1 95%
源代码:https://github.com/mrdulin/python-codelab/tree/master/src/Whosebug/58857424
我不知道如何在单元测试中 mock/patch class 中的方法。我考虑以下解决方法:
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
如何模拟 class A 中的 _get_datetime()
方法?
我想在我的测试环境中定义 class A 中 do_something()
方法中使用的日期。这可能吗?
谢谢!!
这是使用patch.object模拟class_get_datetime
方法的单元测试解决方案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()
包含覆盖率报告的单元测试结果:
(venv) ☁ python-codelab [master] ⚡ coverage run /Users/ldu020/workspace/github.com/mrdulin/python-codelab/src/Whosebug/58857424/test_a.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
(venv) ☁ python-codelab [master] ⚡ coverage report -m
Name Stmts Miss Cover Missing
--------------------------------------------------------------------
src/Whosebug/58857424/a.py 8 1 88% 7
src/Whosebug/58857424/test_a.py 13 0 100%
--------------------------------------------------------------------
TOTAL 21 1 95%
源代码:https://github.com/mrdulin/python-codelab/tree/master/src/Whosebug/58857424