我需要在测试用例中伪造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.