pytest Monkeypatch:每次调用修补方法时是否有可能返回不同的值?

Vit*_*ich 3 python unit-testing pytest python-unittest

unittest我可以用值断言side_effect可迭代 - 当调用修补方法时,每个值都会一一返回,而且我发现unittest我的修补方法中可以根据输入参数返回不同的结果。我可以在 pytest 中做类似的事情吗?文档没有提到这一点。

Vla*_*den 8

您可以使用 Mock 的side_effect参数来设置每次调用返回的内容。

side_effect:每当调用 Mock 时都会调用的函数。请参阅 side_effect 属性。对于引发异常或动态更改返回值很有用。使用与模拟相同的参数调用该函数,除非它返回 DEFAULT,否则该函数的返回值将用作返回值。另外,side_effect 可以是异常类或实例。在这种情况下,调用模拟时将引发异常。如果 side_effect 是一个可迭代对象,那么每次调用模拟都会返回该可迭代对象的下一个值。side_effect 可以通过将其设置为 None 来清除。

例如:

return_data = [3, 5]
test_mock = Mock(side_effect=return_data)
monkeypatch.setattr(your_module, "some_func", test_mock)
Run Code Online (Sandbox Code Playgroud)

这样,第一次调用“some_func”时,它将返回 3,第二次调用时,它将返回 5

如果被调用两次就可以了

assert test_mock.call_count == len(return_data)
Run Code Online (Sandbox Code Playgroud)

返回数据应该是 Iterable(列表、集合、元组)并且可以包含您想要的任何内容(整数、字符串、对象、元组、列表...)