gpt4 book ai didi

python - 修补 Python 模拟中函数调用中的一处出现

转载 作者:行者123 更新时间:2023-11-30 23:01:35 28 4
gpt4 key购买 nike

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

如果我需要修补 foo() 中的第二个(任何其他)open() 调用以模拟读取的 return_value,例如 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 模拟中函数调用中的一处出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34876170/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com