python-3.x - 如何使用带有 Pytest 参数化副作用的补丁进行单元测试?

标签 python-3.x unit-testing mocking pytest

我正在尝试测试我的函数,该函数接受 3 个参数,并且还包含我试图模拟的另一个函数。问题是模拟不会循环通过副作用;我无法将要测试的第一组值(第一个参数化参数)与副作用中的第一个值“匹配”;第二组参数化参数与副作用中的第二个值,依此类推。

我尝试使用固定装置并使用参数化但无济于事。

测试代码

# I go through each set of values I want to test with a different expected output
@pytest.mark.parametrize('banner, year, month, expected', [
    ('ctr', 2019, 1, r'A\path\file.csv'),
    ('mks', 2019, 1, r'B\path\file.csv'),
    ('sc', 2019, 1, r'C\path\file.csv'),
    ('atm', 2019, 1, r'D\path\file.csv')
])
@mock.patch('import.path.to.function.path_formatting')
def test_files(mock_directory_path_banner, banner, year, month, expected):
    # the mocked function always returns 'ctr'
    mock_directory_path_banner.side_effect = ['ctr', 'mww', 'fgl', 'fgl']
    result = get_loyalty_sales_files(banner, year, month)
    assert expected == result

总共有四个测试。第一次通过,因为参数化测试使用来自模拟 (ctr) 的正确值。然而,其余的测试都失败了,因为没有为每个参数化测试调用一个新的模拟。我希望每次循环通过一组新的参数化值时都会调用一个新的模拟,但事实并非如此。

最佳答案

在带有 get_loyalty_sales_files 的文件中你有这样的东西

import path.to.function.path_formatting
不要在 @patch 中使用它,而是使用与本地导入模块相同的路径,然后附加要模拟的函数:
@patch('path.to.file.with.get_loyalty_sales_files.path_formatting')
更多信息 mock.patch可以找到作品in the mock docs .

关于python-3.x - 如何使用带有 Pytest 参数化副作用的补丁进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57380926/

相关文章:

java - 在java中创建模拟对象

python - 我想对 ${ 和 } 之间的字符串进行切片

python - PyGObject:无法控制进度条

python - 在 Python 中模拟标准输出

c# - 带有 IQueryable 扩展方法的最小起订量

java - 我如何在 JMockit 中模拟具有通用对象的方法?

python - 检查范围内的字段

Python - 转换错误

unit-testing - 单元测试预期和非预期死锁行为的明智策略

c# - 我如何模拟 IQueryable<T>