gpt4 book ai didi

python - 模拟 Popen 根据 call_args 返回不同的结果

转载 作者:行者123 更新时间:2023-12-01 09:10:56 24 4
gpt4 key购买 nike

我正在调用一个函数 def sftp(cmdstr, server):,它调用 Popen 来调用系统 sftp 客户端。

我遇到的问题是我有一个 main 函数,它使用不同的参数调用 sftp 两次。第一次使用ls,第二次将get 文件。我模拟了调用,但我无法弄清楚如何分支返回值。

如果第一次调用我希望它链接到下面以返回一个字符串。如果第二次调用我希望它使用 tmpdir.mkdir() 创建文件,以便文件“显示”就像已下载一样。由于代码中稍后发生的操作,这些文件需要实际存在。

p_open = mocker.patch('mymodule.Popen', autospec=True)
mock_rv = mocker.Mock()
mock_rv.returncode = None
stdout_sftp = 'sftp> cd /upload\nsftp> ' \
'ls\n{0} {1} \n{2}' \
' \nsftp> bye\n'.format(
sftp_idf_file_list[0],
sftp_idf_file_list[1],
sftp_idf_file_list[2]
)
mock_rv.communicate.return_value = [stdout_sftp, 'output_err']
p_open.return_value = mock_rv

任何人都知道如何制作: mock_rv.communicate.return_value = [stdout_sftp, 'output_err']引用一个仅在调用模拟时而不是在设置期间之前调用的函数?

还有一点需要注意,代码必须与 python2.7 和 3.6 兼容。

问候,

瑞恩

最佳答案

答案是使用 lambda 和猴子补丁。

首先,我们模拟对 Popen 的调用,以便拥有所有属性,然后设置返回代码,以便在主代码中不会出错。

最后,我们在通信中设置 lambda,这是我们实际进行 sftp 调用的地方。如果我的调用中有“ls”,我想要一个目录列表,因此我返回 sftp 调用中标准输出的字符串。另一方面,在这种情况下,如果没有“ls”,我想运行 get 命令,因此我只需执行一个在目标目录中创建文件的方法,而不是“getting”。

stdout_sftp = 'sftp> cd /upload\nsftp> ' \
'ls\n{0} {1} \n{2}' \
' \nsftp> bye\n'.format(
sftp_idf_file_list[0],
sftp_idf_file_list[1],
sftp_idf_file_list[2]
)

def create_tmp_files(tdir, flist):
""" Used to create temp files to simulate sftp"""
for file_ in flist:
current_file = tdir.join(file_)
current_file.write('')
return "stdout", "stderror"


monkeypatch.setattr('mymodule.Popen', mocker.Mock())
monkeypatch.setattr('mymodule.Popen.return_value.returncode',
None)
monkeypatch.setattr('mymodule.Popen.return_value.communicate',
lambda x: (stdout_sftp, "stderror")
if '\nls\n' in x
else create_tmp_files(
dst_dir,
file_list))

关于python - 模拟 Popen 根据 call_args 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51658866/

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