代码之家  ›  专栏  ›  技术社区  ›  Bongani Sibanda

如何测试函数是否引发异常?

  •  0
  • Bongani Sibanda  · 技术社区  · 7 年前

    def get_foo():
        try:
            return requests.get("http://www.bongani.com")
        except requests.exceptions.ConnectionError:
            print("Error")
    

    我拥有的:

    import unittest
    import mock
    
    
    class MyTestCase(unittest.TestCase):
        @mock.patch('requests.get')
        def test_foo(self, mock_requests_get):
            mock_requests_get.side_effect = requests.exceptions.ConnectionError()
            with self.assertRaises(requests.exceptions.ConnectionError):
                get_foo()
    
    if __name__ == '__main__':
        unittest.main()
    

    我发现这个错误:

    Traceback (most recent call last):
    File "/usr/local/lib/python2.7/site-packages/mock/mock.py", line 1305 , in patched
      return func(*args, **keywargs)
    File "<ipython-input-24-15266e4f708a>", , in test_foo
      get_foo()
    AssertionError: ConnectionError not raised
    

    我想嘲笑 return requests.get("http://www.bongani.com")

    2 回复  |  直到 7 年前
        1
  •  2
  •   dopstar    7 年前

    异常不会冒泡(即被抑制),因为您捕获了它,然后没有重新引发它。反过来,您的单元测试将失败,因为您正在测试您的函数在抑制异常的同时引发该异常。

    根据需要的行为,您可以更改函数或函数的单元测试。

    假设测试是正确的,那么您的函数需要像这样重新引发异常:

    def get_foo():
        try:
            return requests.get("http://www.bongani.com")
        except requests.exceptions.ConnectionError:
            print("Error")
            raise  # <---------------- add this line
    

    class MyTestCase(unittest.TestCase):
        @mock.patch('requests.get')
        def test_foo(self, mock_requests_get):
            mock_requests_get.side_effect = requests.exceptions.ConnectionError()
            self.assertIsNone(get_foo())  # <----- no more assertRaises
    
        2
  •  0
  •   Dan    7 年前

    确保修补了正确的路径

    @mock.patch('path.to.get_foo.requests.get')
    

    mock_requests_get.side_effect = requests.exceptions.ConnectionError