pythonmock:在我正在测试的函数中模拟函数

2024-04-26 00:42:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Mock测试从检索设置的函数返回的结果:

def apply_delta_to_date(original_date):
    delta = MySettings.get_delta()
    result_date = original_date + timedelta(delta)
    return result_date

在测试apply_delta_to_date函数时,我试图模拟对MySettings.get_delta的调用,以模拟其返回特定结果:

class TestAppyDelta():
    def setUp(self):
        self.MySettings = Mock()
        self.MySettings.get_delta = Mock(return_value=10)

    def test_apply_delta(self):
        result = apply_delta_to_date(today)

问题是,我无法“模拟”对MySettings.get_delta()的函数调用,这是我真正想要测试的函数的内部。你知道吗

如何模拟正在测试的函数中的内部函数返回的结果?你知道吗


Tags: to函数selfgetdatereturndefresult
2条回答

你需要的是补丁.object上下文管理器,它完全满足您的需要:它接受一个类和方法,并允许您定义一个自定义返回值。你知道吗

from unittest.mock import patch
from <your-time_utils-module> import apply_delta_to_date, MySettings


class TestAppyDelta():
    def test_apply_delta(self):
        with patch.object(MySettings, 'get_delta', return_value=10) as mock_method:
            result = apply_delta_to_date(today)

            # mock_method has many other useful assertions
            mock_method.assert_called_once()

有关更多详细信息,请参阅文档https://docs.python.org/3/library/unittest.mock.html#quick-guide

你一点也没有嘲笑正确的事情。您所做的就是在测试类中定义MySettings属性。从来没有人叫它。你知道吗

您需要在调用MySettings的地方模拟对MySettings的引用。假设您正在从名为my_delta_module的模块导入apply_delta_to_date

@patch('my_delta_module.MySettings')
def test_apply_delta(self, mock_settings):
    mock_settings.get_delta.return_value = 10
    result = apply_delta_to_date(today)

相关问题 更多 >