假设我修补并模拟了实现读取多个文件的某些函数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/