gpt4 book ai didi

python - 如何在使用 mark.parametrize 装饰器的同时使用补丁装饰器?

转载 作者:行者123 更新时间:2023-12-02 16:13:54 32 4
gpt4 key购买 nike

我有一个测试功能,可以修补一些东西。一旦我达到超过 2 或 3 个补丁,功能开始看起来很糟糕

def test_bla():
with patch(...):
with patch(...):
with patch(...):
# test

所以我尝试开始使用装饰器。这是我的示例测试,当我引入补丁装饰器时它会中断

import pytest
from unittest.mock import patch

class Example:
def _run(self, x):
return x

def run(self, x):
return self._run(x) + 1


@pytest.mark.parametrize('x', [1])
def test_example(x):
assert Example().run(x) == 2


@pytest.mark.parametrize('x', [1])
@patch('Example._run', return_value=0)
def test_example_failure(x):
with pytest.raises(AssertionError):
assert Example().run(x) == 2

这是我得到的错误:

platform linux -- Python 3.6.13, pytest-6.2.1, py-1.10.0, pluggy-0.13.1
rootdir: ..., configfile: pytest.ini
plugins: metadata-1.11.0
collected 0 items / 1 error

==================================================================================================== ERRORS ====================================================================================================
________________________________________________________________________________________ ERROR collecting test_patch.py ________________________________________________________________________________________
In test_example_failure: function uses no argument 'x'
=========================================================================================== short test summary info ============================================================================================
ERROR test_patch.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=============================================================================================== 1 error in 0.12s ===============================================================================================

我尝试更 retrofit 饰器顺序(正如我在一些 SO 答案中看到的那样),但这没有帮助。


我刚刚意识到的另一件事是,有一个没有参数化的测试参数是可行的! (我调整了一些代码,因为事实证明我无法从我自己的模块中修补一个类)

import pytest                                                                                                                                                                                                   
import random
from unittest.mock import patch

class Example:
def _run(self, x):
return random.randint(0, 6)

def run(self, x):
return self._run(x) + 1


@pytest.mark.parametrize('x', [1])
def test_example(x):
assert Example().run(x) < 7


# @pytest.mark.parametrize('x', [1])
@patch('random.randint', return_value=0)
def test_example_failure(x): # <<< How the heck does this work? 'x' is not defined!!
with pytest.raises(AssertionError):
assert Example().run(x) == 2

最佳答案

@patch 正在向测试发送一个参数,MagicMock 对象。如果你想从 @pytest.mark.parametrize 发送另一个参数,你需要向测试添加另一个参数

@pytest.mark.parametrize('x', [1])
@patch('Example._run', return_value=0)
def test_example_failure(mocked_class, x):
with pytest.raises(AssertionError):
assert Example().run(x) == 2

# randint = <MagicMock name='randint' id='2158546057008'>
# x = 1

关于python - 如何在使用 mark.parametrize 装饰器的同时使用补丁装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67266063/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com