如何在测试用例中伪造 sys.stdout.istty 而不会与 pytest 标准输出捕获冲突



我需要在测试用例中伪造sys.stdout.istty()的返回值。使用monkeypatch.setattr("sys.stdout.isatty", lambda: True)进行猴子修补是没有选择的,因为它在使用选项 -s 时与 pytest 标准输出捕获冲突。如何在测试用例级别伪造?

Python 不允许猴子修补内置类型,如 file。 sys.stdout是一个文件对象。补丁必须应用于生产代码模块命名空间 ( <module>.sys.stdout )。使用pytest-mock(夹具mocker)时,如下所示:

def test_of_prod_code_with_dependency(mocker):
    stdout_mock = mocker.patch("<module>.sys.stdout")
    stdout_mock.isatty.return_value = istty
    # production code which depends on sys.stdout.isatty() comes here

使用 pytest 的 monkeypatch

要将 lambda 用作函数,您需要将其括起来。

import pytest
def test_stdout_istty(monkeypatch):
    # To use a lambda as a function, you need to parenthesize it.
    monkeypatch.setattr("sys.stdout.isatty", (lambda: True))
    #                                        ^            ^
    assert sys.stdout.isatty() == True
    assert sys.stdout.isatty() == False

使用单元测试模拟

import pytest
from unittest import mock
def test_stdout_istty():
    with mock.patch('sys.stdout') as stdout:
        stdout.isatty.return_value = False
        assert sys.stdout.isatty() == False
        assert sys.stdout.isatty() == True
        # if your code contains stdout.isatty, 
        # then put inside of the context manager. 

最新更新