【问题标题】:Python - How to unit-test this method that uses Popen?Python - 如何对这种使用 Popen 的方法进行单元测试?
【发布时间】:2017-07-01 22:12:48
【问题描述】:

我有一个看起来像这样的函数:

def run_shell_command_return_output(command_array):
    output = []
    p = Popen(command_array, stdout=PIPE, bufsize=1)
    with p.stdout:
        for line in iter(p.stdout.readline, b''):
            output.append(line.decode('utf8').strip())
    p.wait()
    return output

我正在尝试弄清楚如何对使用此方法的代码进行单元测试,以便它实际上不会命中文件系统,而是使用虚假的返回数据和状态代码。

我已经看到了有关如何通过communicate() 模拟使用popen 的代码的信息,例如How to unit test a function that uses Popen?,但我无法弄清楚如何以这种方式使用popen 模拟代码。

如何在此处伪造 popen 以便此方法可以返回伪造的输出?

【问题讨论】:

    标签: python unit-testing mocking python-unittest


    【解决方案1】:

    首先,我会更简单地重写函数。特别是,with 语句是不必要的,因为您既不打开(也不负责关闭)p.stdout

    def run_shell_command_return_output(command_array):
        output = []
        p = Popen(command_array, stdout=PIPE, bufsize=1)
        for line in p.stdout:
            output.append(line.decode('utf8').strip())
        # I think the wait is redundant, since reads on p.stdout
        # would block if p is still running.
        p.wait()
        return output
    

    现在进行测试,您只需模拟 Popen 并将 p.stdout 配置为具有所需数据的类文件对象。

    with mock.patch('Popen') as mock_popen:
        mock_popen.return_value.stdout = io.StringIO("data\ndata\ndata\n")
        output = run_shell_command_return_output(["what", "ever"])
    assert output == ["data", "data", "data"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多