如何使用mock或pytest-mock修补变量。 假设该变量是在另一个 python 脚本中定义的,并且被许多其他脚本使用。 我想在
pytest_cmdline_main
内模拟它,以便使用该变量的所有脚本都将被相应地模拟。
一个简单的例子是
VAR = "something"
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()
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 更新
通过