Python模拟: 如何根据输入值更改行为?

3

我正在尝试用Python编写测试覆盖我的一个类。

该类有一个被注入进去的依赖项。

class UnderTest:
    def __init__(self, dependency):
        self.dependency = dependency

我并不关心依赖的内部细节,希望能够对其进行模拟。

因此,在我的测试中实例化该类,并注入依赖项:

dependency = MagicMock()
dependency.some_func = MagicMock(return_value='blue')
under_test = UnderTest(dependency)

后来当我想要测试UnderTest类时,我希望依赖根据传递给它的参数返回不同的值。因此,在被测试的代码中,我可能会有像这样的内容:

value = dependency.some_func('a')

但是我也希望当使用不同的值调用依赖时,它能返回其他内容。

value = dependency.some_func('b')

理想情况下(我在其他框架中见过这种功能),我希望能够配置虚拟数据返回不同的值,例如(我希望它能够实现的方式):
dependency.some_func = MagicMock([
    {'called_with': 'a', 'return_value': 'blue'}, 
    {'called_with': 'b', 'return_value': 'green'}
])
1个回答

2
您可以使用 side_effect 属性来设置一个可调用对象,根据其参数返回不同的值。
results = {'a': 'blue', 'b': 'green'}
dependency.some_func = MagicMock(side_effect=lambda arg: results.get(arg, DEFAULT))

DEFAULT单例用于表示在字典中不存在的参数将使用正常的模拟返回值。)


完美。非常感谢。 - Jordan Dashel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接