是否可以修补在另一个 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