【问题标题】:pytest patch generate exception for Class method callpytest 补丁为类方法调用生成异常
【发布时间】:2023-01-08 10:58:08
【问题描述】:

我正在使用 side_effect 测试生成的模拟异常。基于此页面 https://changhsinlee.com/pytest-mock/ 我试图在调用 load_data 方法时生成异常,但它对我不起作用。

test_load_data.py::test_slow_load_02 FAILED                              [100%]
tests/pytest_samples/test_load_data.py:31 (test_slow_load_02)
ds_mock = <MagicMock name='DataSet' id='4473855648'>

    @patch("python_tools.pytest_samples.load_data.DataSet")
    def test_slow_load_02(ds_mock):
        with patch.object(ds_mock, 'load_data', side_effect=Exception('URLError')):
>           with pytest.raises(Exception) as excinfo:
E           Failed: DID NOT RAISE <class 'Exception'>

test_load_data.py:35: Failed

这是代码。

慢.py

class DataSet:

    def load_data(self):
        return 'Loading Data'

加载数据.py

from python_tools.pytest_samples.slow import DataSet


def slow_load():
    dataset = DataSet()
    return dataset.load_data()

测试数据.py

@patch("python_tools.pytest_samples.load_data.DataSet")
def test_slow_load_02(ds_mock):
    with patch.object(ds_mock, 'load_data', side_effect=Exception('URLError')):
        with pytest.raises(Exception) as excinfo:
            actual = slow_load()
        assert str(excinfo.value) == 'URLError'

这个测试代码对我有用:

def test_slow_load_01(mocker):
    with mocker.patch("python_tools.pytest_samples.load_data.DataSet.load_data", side_effect=Exception('URLError')):
        with pytest.raises(Exception) as excinfo:
            actual = slow_load()
        assert str(excinfo.value) == 'URLError'

我想了解为什么 patch 和 patch.object 不起作用。

谢谢

【问题讨论】:

    标签: python python-3.x pytest pytest-mock


    【解决方案1】:

    您正在修补错误的东西; load_data.py 没有引用类 using python_tools.pytest_samples.slow.DataSet;它使用自己的全局变量DataSet

    @patch('load_data.DataSet')
    def test_slow_load_02(ds_mock):
        with patch.object(ds_mock, 'load_data', side_effect=Exception('URLError')):
            with pytest.raises(Exception) as excinfo:
                actual = slow_load()
            assert str(excinfo.value) == 'URLError'
    

    你不需要patch.object;您正在修补的对象已经是一个模拟对象。

    @patch('load_data.DataSet')
    def test_slow_load_02(ds_mock):
        ds_mock.load_data.side_effect = Exception('URLError')
        with pytest.raises(Exception) as excinfo:
            actual = slow_load()
        assert str(excinfo.value) == 'URLError'
    

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 2023-01-03
      • 2020-10-29
      • 1970-01-01
      • 2017-01-31
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多