gpt4 book ai didi

Python unittest 模拟运行程序两次

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:36 26 4
gpt4 key购买 nike

试图更多地了解 unittest.mock,但不确定为什么它会运行该程序两次。为简单起见,考虑文件 test.py 中的以下代码:

from unittest.mock import patch

class T():
def __init__(self):
self.setup()

def setup(self):
mock_testing = patch('test.testing').start()
mock_testing.return_value = "new testing"

def testing():
return "testing"

print("Hello")

t = T()

print("Setting up")

if testing() == "testing":
print("old style")
elif testing() == "new testing":
print("new style")

当我用 python test.py 运行脚本时,我得到:

Hello
Hello
Setting up
new style
Setting up
old style

为什么它运行代码两次?即使它确实运行了两次,为什么会背靠背打印“hello”,应该像这样打印:

Hello
Setting up
new style
Hello
Setting up
old style

另外,我怎样才能让它只运行一次代码,并使用“新测试”的模拟值?

最佳答案

这是因为脚本被加载为模块 __main__首先,但您正在调用 patchtest.testing , 所以 patch将导入 test.py再次作为 test模块。自 patch"Setting up" 之前调用被打印,加载 test模块,以及 "Hello" 的打印通过__main__模块和 test模块,将在 "Setting up" 之前完成由 __main__ 打印模块。

如果添加 __name__ print 的参数,你会更容易地看到发生了什么:

from unittest.mock import patch

class T():
def __init__(self):
self.setup()

def setup(self):
mock_testing = patch('test.testing').start()
mock_testing.return_value = "new testing"

def testing():
return "testing"

print(__name__, "Hello")

t = T()

print(__name__, "Setting up")

if testing() == "testing":
print(__name__, "old style")
elif testing() == "new testing":
print(__name__, "new style")

这个输出:

__main__ Hello
test Hello
test Setting up
test new style
__main__ Setting up
__main__ old style

为避免这种情况,您应该修补 __main__.testing相反,这样修改后,上面的代码会输出:

__main__ Hello
__main__ Setting up
__main__ new style

关于Python unittest 模拟运行程序两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847434/

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