只有特定参数的 Python 模拟函数

标签 python python-2.7 python-mock

我是 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')

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

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

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() 对象替换之前的原始函数。

关于只有特定参数的 Python 模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27209701/

相关文章:

python - 如何在 python-telegram-bot 包装器中使用 ForceReply

python - matplotlib 中带有颜色的 3d 散点图

javascript - 基于服务器的 Bokeh 图更新

python - 使用适用于 Python 的 Azure IoT SDK 上传图像

python - 如何模拟一个方法并查看它是否被调用?

Python 如何重用 Mock 以避免多次编写 mock.patch?

python - 在数组中选择 N 个均匀间隔的元素,包括第一个和最后一个

python - 在 Python 2.7 中编织内联 C++ 代码

python - Py2Exe 没有这样的文件或目录错误

python - 我可以向 Python "Mock"对象添加实例方法吗?