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

时间:2014-11-30 03:31:42

标签: 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类似的内容吗? e.g:

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

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

1 个答案:

答案 0 :(得分:5)

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

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()对象。