gpt4 book ai didi

python - 模拟 subprocess.Popen 而不执行

转载 作者:行者123 更新时间:2023-11-30 22:24:25 28 4
gpt4 key购买 nike

我正在尝试为调用 subprocess.Popen 的方法编写单元测试。我想要测试的是发送到 Popen 的 arg 参数是否符合预期。我实际上并不希望 Popen 运行。如果不模拟 arg 列表,这可能吗?

例如

def call_something(argument_list):
binary = '/opt/mybin/'
Popen([binary] + argument_list)

然后,进行测试。

@mock.patch('subprocess.Popen')
def test_call_something(self, mock_popen):
binary = '/opt/mybin/'
args = ['foo', 'bar']

mock_popen.return_value.returncode = 0
mock_popen.return_value.communicate.return_value = ('Running', '')

call_something(args)

self.assertEqual(
[binary] + args,
mock_popen.call_args_list
)

我在这里遇到的问题是,首先调用二进制文件(我不想要),其次,call_args_list 为空。

最佳答案

使用mock.patch时,您必须指向导入它的对象

请参阅documentationthis article这很好地解释了这一点。

<小时/>

例如,就您而言:

代码.py

from subprocess import Popen

def call_something(argument_list):
binary = '/opt/mybin/'
Popen([binary] + argument_list)

test.py(假设两个文件位于同一文件夹中,您需要修补 code.Popen 而不是 subprocess.Popen测试)

from code import call_something

@mock.patch('code.Popen')
def test_call_something(self, mock_popen):
binary = '/opt/mybin/'
args = ['foo', 'bar']
mock_popen.return_value.returncode = 0
mock_popen.return_value.communicate.return_value = ('Running', '')

call_something(args)

self.assertEqual(
[binary] + args,
mock_popen.call_args_list
)

关于python - 模拟 subprocess.Popen 而不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830742/

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