gpt4 book ai didi

python - Pytest:修补全局变量

转载 作者:行者123 更新时间:2023-12-04 16:46:05 41 4
gpt4 key购买 nike

如何使用模拟或 pytest-mock 修补变量。假设该变量是在另一个 python 脚本中定义的,并且被许多其他脚本使用。我想在 pytest_cmdline_main 内 mock 它这样所有使用该变量的脚本都将被相应地模拟。
一个简单的例子是
在 env.py

VAR = "something"
在 conftest.py
import os
import sys
from unittest.mock import patch


TEST_DIR = os.path.dirname(os.path.realpath(__file__))


class MockThings():
def __init__(self):
self.setup()

def setup(self):
mock_var = patch('env.VAR').start()
mock_var.return_value = "updated"


def pytest_cmdline_main(config):
sys.path.append(TEST_DIR)
MockThings()
在 test_something.py 中
from env import VAR


def test_sample():
print(VAR)
# do something else here
assert False

def test_sample2():
print(VAR)
# do something else here
assert False
当您运行时 pytest -v测试将按预期失败,但在标准输出下它会说明: <MagicMock name='VAR' id='140102687826416'>因为它将模拟视为一个函数,如果我替换 print(VAR)print(VAR())那么打印输出将是正确的( updated )。
我如何模拟这个变量,而不是把它当作一个函数?我知道你可以设置 VAR="updated"在测试函数本身中,但我只想模拟它,我想这不是我实际用例的一个很好的表示,但我只是想有一个快速简单的测试代码,您可以轻松运行和理解。

最佳答案

假设你有 env.py像这样:

VAR = "something"

def func():
return VAR
然后,在 test_something.py , 你可以模拟 VAR像这样:
import pytest

from env.py import func


@pytest.fixture
def var(mocker):
return mocker.patch("env.VAR", new="updated", autospec=False)


def test_func(var):
print(func())
assert func() == "updated"
在这种情况下,运行 pytest . -v -s将打印出:

test_something.py::test_func updated
PASSED

关于python - Pytest:修补全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69682479/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com