【发布时间】:2017-07-11 13:22:31
【问题描述】:
我想捕获并分析执行此操作的函数的输出:
subprocess.call(args, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr)
当我在 py.test 下运行此代码而没有任何模拟时,我收到错误:ValueError: redirected Stdin is pseudofile, has no fileno()
当我用 mock 修补 sys.stdin(和其他)时,我得到了同样的错误。
当我使用 mock.mock_open() 修补 sys.stdin 时,我收到错误:AttributeError: Mock object has no attribute 'write'
当我使用 mock.mock_open()('name', 'r') 修补 sys.stdin 时,我收到初始错误:ValueError: redirected Stdin is pseudofile, has no fileno()
有什么方法可以将某种模拟对象作为标准输入/输出传递给子进程吗?
我想要这样的东西:
mocked = (put something here)
subprocess_call('ls', stdin=mocked, stdout=mocked, stderr=mocked)
在 py.test 下运行时应该可以工作。
谢谢。
【问题讨论】:
-
你为什么不嘲笑
subprocess.call?您不是在测试subprocess是否有效,只有当使用subprocess的代码有效时。 -
有人可能会争辩说,测试外部命令是否正常工作不是您的工作;你想模拟
subprocess_call本身。 -
这个测试是集成测试的一部分,我只模拟 stdout/err 来检查命令结果(因为否则它们会直接进入用户终端)。我需要实际的外部程序输出(来自“args”)来查看我的程序和外部程序都做了他们应该做的事情。
-
然后将不同的对象分配给
sys.stdout和sys.stderr。请务必考虑这些带有文件描述符的必须对象。 -
谢谢。我可以用模拟创建它们吗?我喜欢稍后检查输出的方式,分配真实文件不是很方便(我需要留意磁盘空间,删除那些文件等)。
标签: python mocking subprocess pytest