Pytest:修补全局变量

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

如何使用mock或pytest-mock修补变量。 假设该变量是在另一个 python 脚本中定义的,并且被许多其他脚本使用。 我想在

pytest_cmdline_main
内模拟它,以便使用该变量的所有脚本都将被相应地模拟。

一个简单的例子是

在 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"
,但我只是想模拟它,我想这并不能很好地代表我的实际用例,但我只是想有一个可以运行的快速简单的测试代码并且容易理解。

python mocking pytest
1个回答
0
投票

假设你有这样的

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 更新
通过

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