假设我修补并模拟了实现读取多个文件的某些函数foo()。因此,我们有多个open()调用:

def foo():
    a=open("stuff.txt")
    b=open("another_thing.txt")
    c=open("last_one.txt")


如果我执行mock.patch("__builtin__.open", return_value='kaboom'),则将修补第一次出现的open(),该读取文件名为“ stuff.txt”。

如果我需要修补open()中的第二个(任何其他)foo()调用以模仿读取的返回值,比如说another_thing.txt,该怎么办?

最佳答案

因为您不喜欢最好的答案(但以理的答案),所以我可以通过side_effect告诉您如何做到:

>>> import mock
>>> with mock.patch("__builtin__.open", side_effect = ["kaboom", "more","moremore"]):
...     assert "kaboom" == open("stuff.txt")
...     assert "more" == open("another_thing.txt")
...     assert "moremore" == open("last_one.txt")


或更好

>>> with mock.patch("__builtin__.open", side_effect = lambda name, *args: name):
...     assert "stuff.txt" == open("stuff.txt")
...     assert "another_thing.txt" == open("another_thing.txt")
...     assert "last_one.txt" == open("last_one.txt")




我写了一条评论,我认为在此答案上下文中很重要:这是进行此类测试的错误方法。在此测试中,您正在编写缠结测试和生产代码的电线。

如果您无法重构代码以更模块化和更可测试的方式编写代码,则应使用此测试来检查行为,并在使用它后立即重构代码而不更改行为。最后一步是使用重构代码重写测试,然后删除旧测试。

关于python - 在Python的Mock中的函数调用上修补一次事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34876170/

10-16 05:06