pytest - pytest mock patch side_effect 与 pytest.mark.parametrize 一起使用时不会迭代
问题描述
我有以下 pytest 脚本,并且该side_effect
值[2, 6]
没有被迭代。它总是卡2
在 test 函数test_my_function
中。
我的问题是:
如何使值与函数中的测试用例side_effect
一起迭代。(假设我们必须使用)。parametrize
test_my_function
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)
解决方案
首先,如果您模拟您要测试的功能,您的测试并没有真正测试任何东西
其次,每次调用测试函数时都会设置函数范围的夹具——对于每个参数化案例集,它都会运行你的夹具
这意味着(在您的示例中)您的测试的两个调用都将被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 核心开发人员
推荐阅读
- r - 用 gsub 删除方括号不起作用
- sql-server - 无法使用 SSMS 登录我的 SQL Docker 实例
- c++ - Clang 或 GCC 在拒绝/接受此 CTAD 代码时是否正确?
- sql - SQL Day-over-Day 计数错误计算
- arrays - 如何使用 jq 将对象列表转换为列表对象?
- c# - 如何使用 CoinGecko C# API 获取硬币的市值?
- java - 如何在 Java 中发出 PATCH 请求(使用 SSL)?
- javascript - 使用 .filter 过滤两个数组
- html - 如何在 Bootstrap 中居中对齐多个列?
- python-3.x - pgAdmin4 在 OpenSUSE Leap 15.2 上不显示服务器连接