Python AssertRails针对用户定义的异常

Python AssertRails针对用户定义的异常,python,class,exception-handling,message-passing,assertraises,Python,Class,Exception Handling,Message Passing,Assertraises,以下问题是由中的讨论引发的 假设有两个文件(foobar.py和foobar_unittest.py)。文件foobar.py包含一个具有两个函数(foo和bar)的类(foobar)。函数栏引发内置异常,函数foo引发用户定义的异常 # foobar.py class MyException(Exception): pass class FooBar: def __init__(self): pass def bar(self): rai

以下问题是由中的讨论引发的

假设有两个文件(foobar.py和foobar_unittest.py)。文件foobar.py包含一个具有两个函数(foo和bar)的类(foobar)。函数栏引发内置异常,函数foo引发用户定义的异常

# 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.py上运行单元测试时,为什么引发用户定义异常(foo)的函数无法通过测试

>>> 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)

从foobar导入MyException,不要重新定义它

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()
这段代码现在应该可以正常工作了

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

OK

您定义了两个不同的
MyException
类。您没有引发与您试图捕获的异常相同的异常。@VincentSavard如果我删除foobar_unittest.py中定义
MyException
的两行,那么我将收到以下错误:
NameError:未定义全局名称“MyException”
。是的,这就是上述问题的答案。非常感谢。
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK