我是 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/