【问题标题】:Python Mock: Mocking a function inside the function I'm testingPython Mock:在我正在测试的函数中模拟一个函数
【发布时间】:2019-09-13 13:04:36
【问题描述】:

我正在尝试使用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() 的函数调用,这是我真正想要测试的函数内部。

如何在我正在测试的函数中模拟内部函数返回的结果?

【问题讨论】:

标签: python mocking


【解决方案1】:

你根本没有嘲笑正确的事情。您所做的只是在您的测试类中定义一个 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)

【讨论】:

    【解决方案2】:

    您需要的是 patch.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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2018-12-21
      相关资源
      最近更新 更多