首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模拟subprocess.Popen

模拟subprocess.Popen
EN

Stack Overflow用户
提问于 2018-06-09 23:47:27
回答 1查看 4.7K关注 0票数 3

我有一个具有此run_cmd()方法的模块utils.py

代码语言:javascript
复制
def run_cmd(cmd):
    pipe = subprocess.Popen(cmd,
                            shell=True,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)
    print(pipe.communicate())
    print(pipe.returncode)
    stdout, stderr = [stream.strip() for stream in pipe.communicate()]
    output = ' - STDOUT: "%s"' % stdout if len(stdout) > 0 else ''
    error = ' - STDERR: "%s"' % stdout if len(stderr) > 0 else ''
    logger.debug("Running [{command}] returns: [{rc}]{output}{error}".format(
                 command=cmd,
                 rc=pipe.returncode,
                 output=output,
                 error=error))

    return pipe.returncode, stdout, stderr

我使用模拟和这个链接stackoverflow作为参考编写了一个单元测试

代码语言:javascript
复制
  @patch('subprocess.Popen')
  @patch('utils.logger.debug')
  def test_run_cmd(self, mock_popen, mock_log):
    cmd = 'mock_command'
    mocked_pipe = Mock()
    attrs = {'communicate.return_value': ('output', 'error'), 'returncode': 0}
    mocked_pipe.configure_mock(**attrs)
    mock_popen.return_value = mocked_pipe
    log_calls = [call('Running [mock_command] returns: [0]outputerror')]
    utils.run_cmd(cmd)
    mock_popen.assert_called_once_with(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    mock_log.assert_has_calls(log_calls)

当我运行nosetest时,我得到了这个输出

代码语言:javascript
复制
        stdout, stderr = [stream.strip() for stream in pipe.communicate()]
ValueError: need more than 0 values to unpack
-------------------- >> begin captured stdout << ---------------------
<MagicMock name='Popen().communicate()' id='140197276165008'>
<MagicMock name='Popen().returncode' id='140197276242512'>

--------------------- >> end captured stdout << ----------------------
FAILED (errors=1)

为什么pipe.communicate()不打印('output','error'),或者pipe.returncode不打印0,而是他们的模拟方法?哪里出了问题?我该怎么解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 00:46:54

啊,你的问题已经有答案了。仔细看看,你就会知道原因了。你必须像你为logger做的那样嘲笑。在创建模拟对象时,您忘记了提到utils

代码语言:javascript
复制
@patch('utils.subprocess.Popen')

现在,模拟具有多个值的嵌套函数,我认为您应该看看side_effectshere

我还没有测试下面的代码,但我希望它可以工作,或者至少给你一些引导。

代码语言:javascript
复制
mocked_open.return_value.communicate.return_value = ('output', 'error')
mocked_open.return_value.returncode = 0

希望这能有所帮助!

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50775969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档