如何在模拟测试时检索和验证subprocess.popen参数?

时间:2016-02-19 15:25:29

标签: python unit-testing mocking popen

以下示例:

import subprocess
import mock

class MyArgs():

    cmd = ''
    cmd_args = ''
    cmd_path = ''

    def __init__(self):
        pass

    def set_args(self, c, a, p):
        self.cmd = c
        self.cmd_args = a
        self.cmd_path = p

    def get_command(self):
        return ([self.cmd, self.cmd_args, self.cmd_path])

class Example():

    args = MyArgs()

    def __init__(self):
        pass

    def run_ls_command(self):
        print 'run_ls_command command:' + str(self.get_command())
        p = subprocess.Popen(self.get_command(), stdout=subprocess.PIPE)
        out, err = p.communicate()
        print out   #to verify the mock is working, should output 'output' if the mock is called
        return err

    def set_args(self, c, a, p):
        #this would be more complicated logic in 
        #future and likely not just one method, this is a MWE
        self.args.set_args(c,a,p)

    def get_command(self):
        return self.args.get_command()


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

    e = Example()
    e.set_args('ls', '-al', '/bin/foobar')
    e.run_ls_command()
    #todo: validate arguments called by the popen command for the test


test_subprocess_popen()

长期目标是能够验证更复杂的subprocess.Popen命令,这些命令将通过对Example对象的更多操作来构造(尽管概念与此示例相同)。< / p>

我想做的是以某种方式分析发送到p = subprocess.Popen(self.get_command(), stdout=subprocess.PIPE)命令的参数

但是我不知道如何获得这些参数 - 我知道我的模拟被调用,因为我的输出匹配模拟的预期。

0 个答案:

没有答案