首页 > 解决方案 > pytest mock patch side_effect 与 pytest.mark.parametrize 一起使用时不会迭代

问题描述

我有以下 pytest 脚本,并且该side_effect[2, 6]没有被迭代。它总是卡2在 test 函数test_my_function中。

我的问题是:

如何使值与函数中的测试用例side_effect一起迭代。(假设我们必须使用)。parametrizetest_my_functionparametrize

#!/usr/bin/env python3
#

import pytest

def my_function(x):
    return x*2

@pytest.fixture
def mock_my_function(mocker):
    mocker.patch(
        __name__ + ".my_function", side_effect=[2, 6]
    )

@pytest.mark.parametrize("input, expect", [(1, 2), (3, 6)])
def test_my_function(input, expect, mock_my_function):
    assert expect == my_function(input)

    

标签: pytestparametrized-testing

解决方案


首先,如果您模拟您要测试的功能,您的测试并没有真正测试任何东西

其次,每次调用测试函数时都会设置函数范围的夹具——对于每个参数化案例集,它都会运行你的夹具

这意味着(在您的示例中)您的测试的两个调用都将被my_function模拟为返回 2 发生的唯一调用

如果您想另外对模拟函数进行参数化,我建议将其包含在您的参数化列表中:

@pytest.mark.parametrize(
    ('input', 'expect', 'mocked_ret'),
    (
        (1, 2, 2),
        (3, 6, 6),
    ),
)
def test_my_function(input, expect, mocked_ret, mocker):
    mocker.patch(f"{__name__}.my_function", return_value=mocked_ret)

    assert my_function(input) == expect

免责声明:我是 pytest 核心开发人员


推荐阅读