2

Следующий вопрос был инициирован обсуждением в this post.Python assertRaises по пользовательским исключениям

Предположим, два файла (foobar.py и foobar_unittest.py). Файл foobar.py содержит класс (FooBar) с двумя функциями (Foo и бар). Функция bar создает встроенное исключение, функция 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_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() 

При запуске юнит-тест на 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) 
+0

Вы определили два различных 'классов MyException'. Вы не поднимаете то же исключение, что и тот, который вы пытаетесь поймать. –

+0

@VincentSavard Если бы мне пришлось удалить две строки в _foobar_unittest.py_, которые определяют 'MyException', тогда я получаю следующую ошибку:' NameError: глобальное имя 'MyException' не определено'. –

ответ

0

импорт MyException из foobar, не переопределяйте его.

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 
+0

Да, это был ответ на вышеупомянутый вопрос. Спасибо! –