pytest模拟补丁side_effect与pytest.mark. parameterize一起使用时不会迭代.<



我有下面的pytest脚本和side_effect[2, 6]没有得到迭代。在测试函数test_my_function中,始终保持值2

我的问题是:

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

#!/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)

首先,如果您模拟要测试的函数,那么您的测试并没有真正测试任何内容

第二,每次调用测试函数时都会设置函数作用域的fixture——对于每个参数化案例集,它都会运行fixture

这意味着(在您的示例中)您的测试的两个调用都将使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核心开发人员

相关内容

最新更新