python pytest 有时会失败并出现 OSError: 在捕获输出时从 stdin 读取

问题描述 投票:0回答:4

使用

unittest
运行特定的
pytest
时,偶尔会因此错误而失败(标题中提到),并且从堆栈跟踪来看,它发生在线路上

choice = input().lower()

当控件到达这句语句时,整个功能是:

def prompt_to_activate(bear, printer):
    PROMPT_TO_ACTIVATE_STR = ('program has found {} to be useful '
                              'based of dependencies discovered from your '
                              'project files. \n Would you like to activate '
                              'it? (y/n)')
    printer.print(PROMPT_TO_ACTIVATE_STR)

    choice = input().lower()

    if choice.startswith('y'):
        return True
    elif choice.startswith('n'):
        return False
    else:
        return prompt_to_activate(bear, printer)
for i in range(0, 3):
    a = i
print(a)

我尝试在该声明之前添加一些

time.sleep(x)
,但这并不能解决问题。有人可以告诉我发生这种情况的确切原因以及如何解决它吗?

python unit-testing pytest python-unittest
4个回答
14
投票

如果您设置了断点,但没有在 pytest 中使用

-s
标志,您也可能会收到此消息。


12
投票

由于

input()
是一个交互式函数,因此您需要在自动化测试中模拟返回值。像这样的东西:

def test_prompt(capsys, monkeypatch):
    monkeypatch.setattr('path.to.yourmodule.input', lambda prompt="": "no")
    val = prompt_to_activate(bear=..., printer=...)
    assert not val

5
投票

万一其他人偶然发现了这一点,如果您忘记了代码中的 pdb 断点 (

import ipdb; ipdb.set_trace()
),也会引发此错误。


0
投票

我也遇到了同样的问题,并在学习更多单元测试和模拟后解决了!添加到@wim的答案...模拟输入的另一种方法是:

@mock.patch("my_module.input")
def test_my_actual_func(self, mock_input):
    my_actual_func()

© www.soinside.com 2019 - 2024. All rights reserved.