Python assertRaises on user-defined exceptions

匿名 (未验证) 提交于 2019-12-03 01:00:01

问题:

The following question was triggered by the discussion in this post.

Assume two files (foobar.py and foobar_unittest.py). File foobar.py contains a class (FooBar) with two functions (foo and bar). Function bar raises a built-in exception, function foo a user-defined exception.

# foobar.py class MyException(Exception):     pass class FooBar:     def __init__(self):         pass     def bar(self):         raise ValueError('Hello World.')     def foo(self):         raise MyException('Hello World.') 

.

# foobar_unittest.py import unittest import foobar as fb class MyException(Exception):     pass class FooBarTestCases(unittest.TestCase):     def test_bar(self):         with self.assertRaises(ValueError):             fb.FooBar().bar()     def test_foo(self):         with self.assertRaises(MyException):             fb.FooBar().foo() if __name__ == '__main__':     unittest.main() 

When running unit-test on foobar.py, why does the function raising the user-defined exception (foo) fail to pass the test?

>>> python2.7 foobar_unittest.py  .E ====================================================================== ERROR: test_foo (__main__.FooBarTestCases) ---------------------------------------------------------------------- Traceback (most recent call last):   File "foobar_unittest.py", line 11, in test_foo     fb.FooBar().foo()   File "/a_path/foobar.py", line 9, in foo     raise MyException('Hello World.') MyException: Hello World.  ---------------------------------------------------------------------- Ran 2 tests in 0.000s  FAILED (errors=1) 

回答1:

import MyException from foobar, don't redefine it.

import unittest from foobar import MyException import foobar as fb  class FooBarTestCases(unittest.TestCase):     def test_bar(self):         with self.assertRaises(ValueError):             fb.FooBar().bar()     def test_foo(self):         with self.assertRaises(MyException):             fb.FooBar().foo() if __name__ == '__main__':     unittest.main() 

This code should work now as

.. ---------------------------------------------------------------------- Ran 2 tests in 0.001s  OK 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!