Python 模拟补丁,副作用有几个例外

Python 模拟补丁,副作用有几个例外,python,python-mock,Python,Python Mock,模拟对象时,有一些工具允许更改函数的结果 比如说,有一些类别: class Worker: def do_work(self): return perform_operation() 我想测试一些情况,当do_工作在不同情况下引发几个异常时: @patch( 'my.package.Worker.do_work', Mock(side_effect=[exc.VeryBadError, exc.NotThatBadError] )) def test_

模拟对象时,有一些工具允许更改函数的结果

比如说,有一些类别:

class Worker:

    def do_work(self):
        return perform_operation()
我想测试一些情况,当do_工作在不同情况下引发几个异常时:

@patch(
    'my.package.Worker.do_work',
    Mock(side_effect=[exc.VeryBadError, exc.NotThatBadError]
))
def test_worker_raise_errors():
    worker_user.call_worker()
但是没有办法将几个错误传递给上述副作用,它只会运行一次,并且只会在exc.VeryBadError中失败

当我想找到一种方法来启动测试时,工人会为每个异常引发两次错误,但不会为每个异常创建每个测试函数


是否有一种方法可以针对每个异常启动一个测试数次作为副作用,并在这种情况下看到2个失败?

这个简单的示例将给您提示:

from unittest.mock import Mock

mock = Mock(
    side_effect=[
        AssertionError('Error 1'), 
        AttributeError('Error 2'),
    ]
)

try:
    mock()
except AssertionError as e:     # Catch the exception so that the execution can continue and we can test further.
    print(e)

try:
    mock()
except AttributeError as e:     # Catch the exception so that the execution can continue and we can test further.
    print(e)
输出:

Error 1
Error 2

您可以使用使它更干净。

这可以作为某种参数化测试来完成。检查这个答案:明白了,但是有没有办法让一个函数被调用两次,而不是显式地调用一个模拟实例两次?例如:我想检查5个不同的异常,但不想调用测试代码5次。假设你模拟这样的副作用=[exc.VeryBadError,exc.NotThatBadError],然后worker\u user.call\u worker将开始执行,当它第一次调用do\u work时,将引发exc.VeryBadError,当它第二次调用do\u work时,将引发exc.NotThatBadError。我想这就是你想要的。