3

我是 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 模拟的东西?例如:

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

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

4

1 回答 1

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)

在用对象original_config_get替换之前,这里引用了原始函数。Mock()

于 2014-11-30T03:35:45.720 回答