【问题标题】:Mock stdout in Python在 Python 中模拟标准输出
【发布时间】:2014-08-23 22:31:26
【问题描述】:

我是 Python 单元测试的新手,尤其是 Mock。我将如何模拟可以执行以下操作的对象?我只需要一个不会使循环崩溃的对象即可完成测试。

for ln in theMock.stdout.readlines()

我尝试通过这样做来创建一个模拟

Mock(stdout=Mock(readlines= Lambda: []))

Mock(stdout=Mock(spec=file, wraps=StringIO())

但它说列表对象没有属性stdout

【问题讨论】:

  • 你的意思是stdin.readlines吗?
  • 不,stdout.readlines() 是正确的。
  • 为什么要用try to read stdout?您想知道向标准输出写入了什么吗?
  • 不是我的代码,我只是测试一下。但是,是的,这就是它应该做的。

标签: python unit-testing mocking stringio


【解决方案1】:

这个怎么样?

from mock import Mock

readlines = Mock(return_value=[])
stdout = Mock(readlines=readlines)
theMock = Mock(stdout=stdout)
print(theMock.stdout.readlines())

输出:

[]

您的for 循环将被跳过,因为readlines() 将返回一个空列表。

【讨论】:

  • 很干净。谢谢你,我现在可以回家了!
【解决方案2】:

我的支持 stdout.readline() 和 stdout.readlines() 的解决方案:

import os
import subprocess

class MockStdout():
    def __init__(self, output):
        self.output = output.split('\n')
        self.ix = 0

    def readlines(self):
        return '\n'.join(self.output)
      
    def readline(self):
        value = None
        if self.ix < len(self.output):
             value = self.output[self.ix]
             self.ix += 1
        return value
      
class MockSubprocess:
    def __init__(self, output):
        self.stdout = MockStdout(output)

real_popen = getattr(subprocess, 'Popen')
try:
    setattr(subprocess, 'Popen', lambda *args, **kwargs: MockSubprocess('''First Line
Hello
there
from a stranger
standing here
Last Line
''' ))
    cmd = [ 'a_command',
            '--a_switch',
            '--a_parameter=a_value' ]
    listen_subprocess = subprocess.Popen(cmd,
                                         cwd=os.getcwd(),
                                         stdout=subprocess.PIPE,
                                         universal_newlines=True)
    while True:
        line = listen_subprocess.stdout.readline()
        if not line:
            break
        else:
            print(line)

finally:
    setattr(subprocess.Popen, '__call__', real_popen)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多