python - 如何为多个测试打补丁

标签 python pytest monkeypatching

考虑我的模块 "mymodule.py"

# contents of "mymodule.py"

def func1(x):
    return x * 2

我想模拟这个函数并改变它的返回。根据文档,我可以这样做:
# contents of "test_mymodule.py"

import mymodule
import pytest

@pytest.fixture
def mock_func1():
    def mock_ret(*args, **kwargs):
        return 2

def test_func1_a(monkeypatch, mock_func1):
    monkeypatch.setattr(mymodule, "func1", mock_func1)
    assert mymodule.func1(1) == 2 

def test_func1_b(monkeypatch, mock_func1):
    monkeypatch.setattr(mymodule, "func1", mock_func1)
    assert mymodule.func1(1) != 37 

但是,我不想为每个测试修补模块。 monkeypatch.setattr的正确方法是什么?一次为整个测试模块的范围test_mymodule.py ?

我期待这样的事情
# contents of "test_mymodule.py"

import mymodule
import pytest

@pytest.fixture
def mock_func1():
    def mock_ret(*args, **kwargs):
        return 2

monkeypatch.setattr(mymodule, "func1", mock_func1)

def test_func1_a():
    assert mymodule.func1(1) == 2 

def test_func1_b():
    assert mymodule.func1(1) != 37 

但这让我
NameError: name 'monkeypatch' is not defined

最佳答案

刚刚遇到这个答案,因为我正在尝试做类似的事情。您可以使用这样的装饰器对测试进行预处理。可以在 mock_func_1_in_test 下面添加其他 pytest 装饰器装饰师。

# contents of "test_mymodule.py"

import mymodule
import pytest

@pytest.fixture
def mock_func1():
    def mock_ret(*args, **kwargs):
        return 2

    return mock_ret

def mock_func_1_in_test(func):
    def inner(monkeypatch, mock_func1, *args, **kwargs):
        monkeypatch.setattr(mymodule, "func1", mock_func1)
        return func(*args, **kwargs)
    return inner

@mock_func_1_in_test
def test_func1_a():
    assert mymodule.func1(1) == 2 

@mock_func_1_in_test
def test_func1_b():
    assert mymodule.func1(1) != 37 

这如您所料:
$ pytest
================================== test session starts ===================================
platform darwin -- Python 3.6.6, pytest-3.6.0, py-1.6.0, pluggy-0.6.0
rootdir: /Users/delgadom/git/messin/pytest_test, inifile:
plugins: cov-2.5.1
collected 2 items

test_mymodule.py ..                                                                [100%]

================================ 2 passed in 0.03 seconds ================================

关于python - 如何为多个测试打补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50842956/

相关文章:

python - Monkeypatching 不进行类导入

python - 猴子补丁方法和引用的问题

python - Scipy & Optimize : Minimize example, 如何添加约束?

python - 如何使用 lxml 删除 html 实体(以及更多)?

python - 如何使用 `crontab` 或 `gnome-terminal` 从虚拟环境执行命令

python - 更改相关命令后如何自动运行 py.test?

python - 只在 pandas 组中获取重复值

python - Websocket 连接的 Pytest 测试

python - Haystack 中的可变长度针(Python)

python - 使用常规编码器使对象 JSON 可序列化