模拟函数引发异常以测试except块

杰西·韦伯(Jesse Webb):

我有一个foo调用另一个函数(bar)的函数()。如果调用bar()引发一个HttpError,如果状态代码为404,我想特别处理它,否则重新引发。

我正在尝试围绕此foo函数编写一些单元测试,以模拟对的调用bar()不幸的是,我无法得到模拟调用bar()以引发被我的代码except捕获的异常

这是说明我问题的代码:

import unittest
import mock
from apiclient.errors import HttpError


class FooTests(unittest.TestCase):
    @mock.patch('my_tests.bar')
    def test_foo_shouldReturnResultOfBar_whenBarSucceeds(self, barMock):
        barMock.return_value = True
        result = foo()
        self.assertTrue(result)  # passes

    @mock.patch('my_tests.bar')
    def test_foo_shouldReturnNone_whenBarRaiseHttpError404(self, barMock):
        barMock.side_effect = HttpError(mock.Mock(return_value={'status': 404}), 'not found')
        result = foo()
        self.assertIsNone(result)  # fails, test raises HttpError

    @mock.patch('my_tests.bar')
    def test_foo_shouldRaiseHttpError_whenBarRaiseHttpErrorNot404(self, barMock):
        barMock.side_effect = HttpError(mock.Mock(return_value={'status': 500}), 'error')
        with self.assertRaises(HttpError):  # passes
            foo()

def foo():
    try:
        result = bar()
        return result
    except HttpError as error:
        if error.resp.status == 404:
            print '404 - %s' % error.message
            return None
        raise

def bar():
    raise NotImplementedError()

我跟着模拟文档这不能不说您应该设置side_effect一个的Mock情况下,以一个Exception班有嘲笑功能引发错误。

我还查看了其他一些与StackOverflow相关的Q&A,看来我在做他们正在做的相同事情,以使他们的模拟引发Exception。

为什么设置side_effectbarMock不引起预期Exception得到提升?如果我做的事情很奇怪,我应该如何在except块中测试逻辑

马丁·彼得斯(Martijn Pieters):

您的模拟正在引发异常,但是该error.resp.status值丢失了。而不是使用return_value,只是告诉Mockstatus是一个属性:

barMock.side_effect = HttpError(mock.Mock(status=404), 'not found')

将其他关键字参数Mock()设置为结果对象的属性。

我将您的foobar定义放在my_tests模块中,并添加到HttpError类中,这样我也可以使用它,然后您的测试就可以成功运行:

>>> from my_tests import foo, HttpError
>>> import mock
>>> with mock.patch('my_tests.bar') as barMock:
...     barMock.side_effect = HttpError(mock.Mock(status=404), 'not found')
...     result = my_test.foo()
... 
404 - 
>>> result is None
True

您甚至可以看到print '404 - %s' % error.message生产线运行,但是我想您想在error.content那里使用它。HttpError()无论如何,这是第二个参数设置的属性

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python:在except块中引发另一个异常以供以后捕获

来自分类Dev

测试引发异常的函数

来自分类Dev

使用模拟测试引发异常

来自分类Dev

模拟函数不会在C#单元测试中引发异常

来自分类Dev

使用 Pytest 在函数中模拟引发异常

来自分类Dev

引发异常以指示未找到元素

来自分类Dev

PL/SQL 异常以什么顺序引发?

来自分类Python

如何在嵌套的try / except块中重新引发异常?

来自分类Python

如何在嵌套的try / except块中重新引发异常?

来自分类Dev

如果try块不包含显式引发异常的代码,是否有理由仅捕捉异常以再次引发异常?

来自分类Python

您如何测试Python函数引发异常?

来自分类Dev

TestNG + Mockito,如何测试引发的异常和对模拟的调用

来自分类Dev

如何使用pytest测试try/except块的异常

来自分类Python

Python,模拟:引发异常

来自分类Dev

捕获在析构函数中引发的异常的块

来自分类Java

调用函数时,模拟器引发异常(Android Studio)

来自分类Java

调用函数时,模拟器引发异常(Android Studio)

来自分类Dev

引发异常以禁止对PostgreSQL中的列进行更新

来自分类Dev

用Pytest测试Asyncio:如何通过模拟事件循环来测试try-except块?

来自分类Dev

如何使用JUnit 5测试构造函数引发异常?

来自分类Dev

如何在python 3.5+中没有原始回溯的except块中引发异常

来自分类Dev

try-except块:如果引发异常,则为“ else”的类似物

来自分类Java

在finally块中引发异常

来自分类Dev

在finally块中引发异常

来自分类Java

使EasyMock模拟对象引发异常

来自分类Dev

如何模拟属性引发异常?

来自分类Dev

Python:模拟引发异常的模块

来自分类Dev

Python:涉及try-Except时,引发自定义异常的单元测试失败

来自分类Java

递归函数引发的异常

Related 相关文章

  1. 1

    Python:在except块中引发另一个异常以供以后捕获

  2. 2

    测试引发异常的函数

  3. 3

    使用模拟测试引发异常

  4. 4

    模拟函数不会在C#单元测试中引发异常

  5. 5

    使用 Pytest 在函数中模拟引发异常

  6. 6

    引发异常以指示未找到元素

  7. 7

    PL/SQL 异常以什么顺序引发?

  8. 8

    如何在嵌套的try / except块中重新引发异常?

  9. 9

    如何在嵌套的try / except块中重新引发异常?

  10. 10

    如果try块不包含显式引发异常的代码,是否有理由仅捕捉异常以再次引发异常?

  11. 11

    您如何测试Python函数引发异常?

  12. 12

    TestNG + Mockito,如何测试引发的异常和对模拟的调用

  13. 13

    如何使用pytest测试try/except块的异常

  14. 14

    Python,模拟:引发异常

  15. 15

    捕获在析构函数中引发的异常的块

  16. 16

    调用函数时,模拟器引发异常(Android Studio)

  17. 17

    调用函数时,模拟器引发异常(Android Studio)

  18. 18

    引发异常以禁止对PostgreSQL中的列进行更新

  19. 19

    用Pytest测试Asyncio:如何通过模拟事件循环来测试try-except块?

  20. 20

    如何使用JUnit 5测试构造函数引发异常?

  21. 21

    如何在python 3.5+中没有原始回溯的except块中引发异常

  22. 22

    try-except块:如果引发异常,则为“ else”的类似物

  23. 23

    在finally块中引发异常

  24. 24

    在finally块中引发异常

  25. 25

    使EasyMock模拟对象引发异常

  26. 26

    如何模拟属性引发异常?

  27. 27

    Python:模拟引发异常的模块

  28. 28

    Python:涉及try-Except时,引发自定义异常的单元测试失败

  29. 29

    递归函数引发的异常

热门标签

归档