我有一个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相关的问与答,看起来我在做他们正在做的相同事情,以使他们的模拟引发Exception。
为什么设置side_effect的barMock不引起预期Exception得到提升?如果我做的事情很奇怪,我应该如何在except块中测试逻辑?
                  @MartijnPieters 
                
                  
                    —
                    杰西·韦伯
                    
                  
                
              HttpError是Google的apiclientlib中定义的类,我们在GAE中使用。它__init__是用params定义的,(resp, content)因此我试图为响应创建一个模拟实例,并指定了适当的状态代码。
                
                  我再次尝试不使用代码
                
                  
                    —
                    杰西·韦伯
                    
                  
                
              HttpError,而是尝试使用常规Exception实例。这很完美。这意味着它必须与我如何配置HttpError实例有关,可能与我Mock为响应创建实例的方式有关。
                
resp.status代码存在。哪里HTTPError来的?