是否可以修补在另一个类中调用的方法?

时间:2019-11-14 13:02:11

标签: python mocking python-unittest

我不知道如何在单元测试的类中模拟/修补方法。我考虑以下解决方法:

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()方法中定义使用的日期。有可能吗?

谢谢!!

1 个答案:

答案 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

相关问题