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

时间:2017-10-09 17:22:14

标签: python unit-testing mocking inversion-of-control

我有一个类,我试图用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')

理想情况下(我已在其他框架中看到过这种情况),我可以配置mock来返回不同的值,例如(我希望它如何工作)

dependency.some_func = MagicMock([
    {'called_with': 'a', 'return_value': 'blue'}, 
    {'called_with': 'b', 'return_value': 'green'}
])

1 个答案:

答案 0 :(得分:1)

您可以使用side_effect属性设置一个callable,该callable根据其参数返回不同的值。

results = {'a': 'blue', 'b': 'green'}
dependency.some_func = MagicMock(side_effect=lambda arg: results.get(arg, DEFAULT))

DEFAULT singleton用于表示正常模拟返回值用于不在dict中的参数。)