gpt4 book ai didi

python - 修补来自不同模块的多个方法(使用 Python mock)

转载 作者:太空狗 更新时间:2023-10-29 22:09:19 24 4
gpt4 key购买 nike

我的模块结构:

foo: 
- load() # from DB


bar:
- check() # with user
- take_action()

我想通过模拟加载和检查来测试 take_action(基本上加载值并在执行操作之前与用户进行检查)。

这是模拟:

mock_load  = Mock(side_effects=[<>, <>, <>]) # different data sets
mock_check = Mock(return_value=True) # User approval

如何使用 patch.multiple 在 Python 2.6 中实现这一点?

with patch.multiple(??):
# proceed to test
take_action

最佳答案

简短的回答是不,你不能使用 patch.multiple() 来做到这一点。如 patch.multiple 中所述所有参数都将应用于所有创建的模拟,并且所有参数必须是同一对象的属性。您必须通过单个补丁程序调用一次性执行此操作。

不幸的是,您使用的是 python 2.6,因此您可以像 python: create a "with" block on several context managers 中指出的那样仅使用 nested fron contextlibMultiple context `with` statement in Python 2.6 .

也许更简洁、更简单的方法是使用 @patch 作为装饰器:

@patch("foo.load",side_effects=["a","b","c"])
@patch("bar.check",return_value=True)
def test_mytest(mock_check,mock_load):
take_action()
assert mock_load.called
assert mock_check.called

如果您在测试类的所有测试中都需要它,您可以装饰该类并在所有测试方法中使用模拟:

@patch("foo.load",side_effects=["a","b","c"])
@patch("bar.check",return_value=True)
class TestMyTest(unittest.TestCase)
def test_mytestA(self,mock_check,mock_load):
take_action()
self.assertTrue(mock_load.called)
self.assertTrue(mock_check.called)

def test_mytestA(self,mock_check,mock_load):
mock_check.return_value = False
take_action()
self.assertTrue(mock_load.called)
self.assertTrue(mock_check.called)

最后,您可以使用 withcontextlib 来完成,第一个示例变为:

from contextlib import nested

with nested(patch("foo.load",side_effects=["a","b","c"]), patch("bar.check",return_value=True)) as (mock_load, mock_check):
take_action()
assert mock_load.called
assert mock_check.called

...或者手工嵌套....

with patch("foo.load",side_effects=["a","b","c"]) as mock_load:
with patch("bar.check",return_value=True)) as mock_check:
take_action()
assert mock_load.called
assert mock_check.called

我的感觉是装饰器是最易读且最易于使用的。

关于python - 修补来自不同模块的多个方法(使用 Python mock),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com