模拟 subprocess.Popen 依赖于导入样式

2023-11-30

当尝试模拟 Popen 时,只有当子进程的导入在单元测试代码和主模块代码中都匹配时,我才能使其成功。

给出以下模块 listdir.py:

from subprocess import Popen, PIPE

def listdir(dir):
    cmd = ['ls', dir]
    pc = Popen(cmd, stdout=PIPE, stderr=PIPE)
    out, err = pc.communicate()
    if pc.returncode != 0:
        raise Exception
    return out

和以下单元测试代码 test_listdir.py

import subprocess
import listdir
import mock

@mock.patch.object(subprocess, 'Popen', autospec=True)
def test_listdir(mock_popen):
    mock_popen.return_value.returncode = 0
    mock_popen.return_value.communicate.return_value = ("output", "Error")
    listdir.listdir("/fake_dir")

由于某些原因,由于两个 python 模块之间的导入样式不同,Popen 没有被模拟,并且运行测试总是会引发异常。

如果我更改 listdir.py 以导入所有子过程,例如

import subprocess

def listdir(dir):
    cmd = ['ls', dir]
    pc = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
                          stderr=subprocess.PIPE)
    out, err = pc.communicate()
    if pc.returncode != 0:
        raise ListingErrorException
    return out

然后在测试中返回“输出”。

任何人都愿意解释为什么,我的首选是 两个模块中都有 from subprocess import Popen, Pipe ,但我无法对其进行模拟。


您需要修补 listdir 中的 Popen 副本,而不是刚刚导入的副本。所以,而不是@mock.patch.object(subprocess, 'Popen', autospec=True), try @mock.patch.object(listdir, 'Popen', autospec=True)

请参阅此文档以获取更多信息:http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟 subprocess.Popen 依赖于导入样式 的相关文章

随机推荐

  • hcmap 与 R Shiny 中的本地文件 javascript

    我正在shiny ui和服务器 上开发一个应用程序 我想用Highchart包的hcmap函数实现一个地图 但是 在实现地图时 我发现函数 hcmap 与站点存在依赖关系 https code highcharts com mapdata
  • 动态方法调度

    网上有很多关于动态调度的信息 我感觉自己像个胆小鬼 因为我无法实现它 请帮我 这就是我正在尝试做的事情 ClassA public void createReq public String postReq ClassB Test publi
  • 将动态参数传递给 SQL Server 2008 中的存储过程

    我有这个过程执行另一个由参数及其参数传递的过程datefrom and dateto CREATE procedure dbo execute proc procs varchar 200 pdatefrom date pdateto da
  • 启用 Google API OAuth 范围

    对于使用 Google Apps 脚本创建的应用程序之一 会在我的应用程序中自动添加一些范围 如下所示 https www googleapis com auth drive https www googleapis com auth sc
  • master和reduce之间共享数据

    我需要使用所有reduce 任务的结果执行聚合 基本上 reduce 任务会找到总和 计数以及一个值 我需要将所有总和和计数相加并找到最终平均值 我尝试使用conf setInt在减少 但是当我尝试从主函数访问它时它失败了 class Ma
  • 3D线平面相交,与简单平面

    我在 3D 空间中有两个点 它们的 X 坐标具有不同的符号 所以其中一个肯定位于 X 平面的一侧 另一个位于 X 平面的另一侧 现在我想以最简单和优化的方式找到该平面与两点组成的线的交点 我知道如何进行一般线平面相交 但由于在这种情况下平面
  • python中的OpenCV透视变换

    我正在尝试用 python 校正图像 我有一个单应性 H 来自绕 x y 和 z 轴旋转的旋转矩阵 如下所示 9 95671447e 01 7 83610423e 02 7 47993630e 02 7 69292630e 02 9 965
  • QSqlQuery 准备好的语句 - 正确使用

    我正在尝试确定将准备好的语句与 QSqlQuery 一起使用的正确方法 这些文档对于这个主题不是很具体 void select const QSqlDatabase database QSqlQuery query database que
  • 如何使用 Golem Shiny 应用程序将 4 个盒子排成一排?

    我正在尝试将每行 4 个盒子放入我闪亮的应用程序中 BioTuring 和 Scope 我希望与 FLAT 和 GTEx 对齐在同一行 现在看起来是这样的 需要注意的是 这个应用程序是用 golem 结构完成的 因此 请在帮助时牢记并遵循我
  • 从 .mexglx 到 .mex

    我得到了一个使用外部 C 函数的 Matlab 程序 我只有这个外部函数的编译版本 扩展名是 mexglx 从我已经红色的来看 这个扩展似乎是用linux编译的mex文件版本 我在 Windows XP 下运行 matlab 我的问题是我的
  • 如何通过 NPM 脚本使用 Windows 控制台“设置”变量?

    这在 Windows 控制台中按预期工作 set A qwerty echo A 输出 qwerty 但是当我尝试在 NPM 脚本中运行相同的命令时 包 json scripts qwerty set A qwerty echo A gt
  • 使用 JavaScript 自动填写表单

    这是我的代码 function setActualDate var d1 new Date var y d1 getFullYear var d d1 getDate var m1 d1 getMonth 1 var m2 d1 getMo
  • HttpURLConnection POST,conn.getOutputStream() 抛出异常

    我想使用 HttpURLConnection 进行 POST 我正在以两种方式尝试这一点 但在执行时我总是会遇到异常 conn getOutputStream 我在这两种情况下得到的例外是 java net SocketException
  • Java Spring-data Mongo中的Mongodb请求

    我在文档中有一个数组 id id 1 name name 1 additionalData additionalDataId id 1 1 additionalDataName name 1 1 longText A long story
  • 创建一个pandas表

    在使用 pandas 时 如何显示与此类似的表格 我想我必须使用类似于的数据框df pandas DataFrame results 并显示它display display df 但从那里我不知道该怎么办 您可以将字典传递为data当你使用
  • 如何传递带有存储在单个变量中的引号的命令行参数?

    我想从 shell 脚本调用外部应用程序 但此 shell 脚本在单个变量中获取参数 来自其他脚本 一切都很好 直到我不必对单个参数使用双引号 而是用空格分隔单词 这是我的问题的简化示例 sh param 只是打印所有传递的参数 bin s
  • 在消息框中显示非英语文本

    我在 MS Access 中的应用程序中编写了以下代码 以波斯语 非英语 显示消息框 但是当我输入波斯语 Persion 时 它会键入一些特殊 未知 不同的字符 而且当我运行应用程序时 消息框显示特殊 不同的字符 而不是我想要显示的 msg
  • 在 boost::asio 的上下文中,术语“strand”背后的隐喻是什么?

    As a French native and a boost asio user I have added the strand word to my vocabulary is a toron in French here an imag
  • JAVA链表如何用for循环进行循环?

    您好 我正在尝试创建一个循环遍历链表的 for 循环 对于每条数据 它都会单独列出 我想在这里学习链表 所以没有数组建议 有人知道怎么做吗 示例输出 187 航班 501航班 到目前为止我的代码如下 public static Linked
  • 模拟 subprocess.Popen 依赖于导入样式

    当尝试模拟 Popen 时 只有当子进程的导入在单元测试代码和主模块代码中都匹配时 我才能使其成功 给出以下模块 listdir py from subprocess import Popen PIPE def listdir dir cm