【问题标题】:python assertRaise not catching MagicMock exceptionpython assertRaise 没有捕捉到 MagicMock 异常
【发布时间】:2016-02-28 10:04:13
【问题描述】:

我正在尝试创建一个单元测试来检查 Python 3.4 代码的错误处理。我正在使用 mock 中的 MagicMock 替换子函数并将异常作为副作用引发,然后使用 unittest 中的 assertRaises 来检查引发的异常。

不幸的是,尽管代码似乎正在处理异常,但测试似乎因为异常而崩溃。我尝试重写测试以使用 try/except 循环无效,并且尝试将其转换为nose2 @raise AttributeError 无济于事。

代码中的错误处理是否以某种方式阻止了测试捕获引发的异常?

代码:

import unittest2 as unittest
from mock import MagicMock

class Service():

    def _execute(self, entity, destport):

        print("setting format to json")
        self.format = "json"

        try:
            print("call _reply_in_json")
            getattr(self, "_reply_in_%s" % self.format)(entity, destport)
            return ""
        except AttributeError:
            print("Invalid format requested")
            err = "invalid format requested"
            return err


class TestService(unittest.TestCase):

    def test_executeAttributeError(self):
        self.entity = "butter"
        self.destport = 54
        self.ret = False

        print("## Starting test_executeAttributeError for CsvDs")

        # Set up test objects
        testDS = Service()
        testDS._reply_in_json = MagicMock(name='_reply_in_json', side_effect=Exception(AttributeError))

        # Run the test
        with self.assertRaises(AttributeError):
            print("Execute new request")
            self.ret = testDS._execute(self.entity, self.destport)

        if self.ret:
            self.assertEqual(self.ret, "invalid format requested")

            # Check the call was made correctly.
            testDS._reply_in_json.assert_called_once_with(self.entity, self.destport)
        else:
            print("nothing returned")

        print("test_executeAttributeError for CsvDs completed successfully\n")

if __name__ == '__main__':
   suite = unittest.TestLoader().loadTestsFromTestCase(TestService)
   unittest.TextTestRunner(verbosity=2).run(suite)

输出:

## Starting test_executeAttributeError for CsvDs
Execute new request
setting format to json
call _reply_in_json

Error
Traceback (most recent call last):
  File "daltest/test_test.py", line 37, in test_executeAttributeError
     self.ret = testDS._execute(self.entity, self.destport)
  File "daltest/test_test.py", line 13, in _execute
    getattr(self, "_reply_in_%s" % self.format)(entity, destport)
  File "/usr/lib/python3.4/site-packages/mock/mock.py", line 1062, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "/usr/lib/python3.4/site-packages/mock/mock.py", line 1118, in _mock_call
    raise effect
Exception: <class 'AttributeError'>


Process finished with exit code 0

【问题讨论】:

    标签: python unit-testing exception mocking


    【解决方案1】:

    您没有在副作用中引发 AttributeError,而是引发了一个以 AttributeError 作为其参数的基本异常。直接使用实际异常即可:

    testDS._reply_in_json = MagicMock(name='_reply_in_json', side_effect=AttributeError)
    

    另请注意,您的assertRaises 将失败,因为_execute 捕获该异常并返回错误消息,因此测试用例本身不会看到任何异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2023-04-04
      • 2015-11-21
      相关资源
      最近更新 更多