关于python:如何从模拟实例的方法中抛出异常?

How to throw exception from mocked instance's method?

我想测试的这个演示功能非常直接。

1
2
3
4
5
6
def is_email_deliverable(email):
    try:
        return external.verify(email)
    except Exception:
        logger.error("External failed failed")
        return False

此函数使用我想要模拟的external服务。

但我不知道如何从external.verify(email)中抛出exception,即如何强制执行except条款。

我的尝试:

1
2
3
4
5
6
7
8
9
10
11
12
@patch.object(other_module, 'external')
def test_is_email_deliverable(patched_external):    
    def my_side_effect(email):
        raise Exception("Test")

    patched_external.verify.side_effects = my_side_effect
    # Or,
    # patched_external.verify.side_effects = Exception("Test")
    # Or,
    # patched_external.verify.side_effects = Mock(side_effect=Exception("Test"))

    assert is_email_deliverable("[email protected]") == False

这个问题声称有答案,但对我不起作用。


您使用了side_effects而不是side_effect。有点像这样

1
2
3
4
@patch.object(Class,"attribute")
def foo(attribute):
    attribute.side_effect = Exception()
    # Other things can go here

顺便说一句,它不是一个很好的方法来抓住所有的Exception并按照它来处理。