【问题标题】:Python mock function with only specific argument只有特定参数的 Python 模拟函数
【发布时间】:2014-11-30 03:31:41
【问题描述】:

我是 Python 新手,我试图仅在传递特定参数时模拟一个函数。如果传递的不是所需的参数,我想调用原始函数。

在 Python 2.7 中,我尝试过这样的事情:

from foo import config

def test_something(self):
    original_config = config # config is a Module.

    def side_effect(key):
        if key == 'expected_argument':
            return mocked_result
        else:
            return original_config.get(key)

        config.get = Mock(side_effect=side_effect)

        # actualy_test_something...

它不起作用,因为original_config 不是config 的副本。它引用了相同的模块,最终进入无限循环。我可以尝试克隆原始的 config 模块,但这似乎有点矫枉过正。

我可以使用类似于RSpec's mocks 的东西吗?例如:

obj.stub(:message).with('an_expected_argument').and_return('a_mocked_result')

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • config.get = Mock... 行的缩进是否正确?
  • @PetrGladkikh 是的,没错。
  • 那我就不明白是怎么执行的了。 if 上面的两个分支都以 return 结尾,所以这条线似乎永远都没有到达。

标签: python python-2.7 python-mock


【解决方案1】:

您需要存储对未修补函数的引用首先

def test_something(self):
    original_config_get = config.get

    def side_effect(key):
        if key == 'expected_argument':
            return mocked_result
        else:
            return original_config_get(key)

        config.get = Mock(side_effect=side_effect)

这里original_config_get 引用了原始函数,然后将其替换为Mock() 对象。

【讨论】:

    猜你喜欢
    • 2014-10-29
    • 2020-06-20
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2015-09-16
    • 2022-09-23
    相关资源
    最近更新 更多