仅具有特定参数的Python模拟函数

jpe*_*thy 3 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...
Run Code Online (Sandbox Code Playgroud)

它不会工作,因为original_config不是的副本config。它引用了以无限循环结尾的同一模块。我可以尝试克隆原始config模块,但这似乎是过分的。

我可以使用类似于RSpec的模拟吗?例如:

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

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

Mar*_*ers 7

你需要存储到未打补丁的函数的引用第一

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)
Run Code Online (Sandbox Code Playgroud)

original_config_getMock()对象替换原始功能之前,这里引用了原始功能。