从模块导入 __init__.py 时发出测试用户定义的异常
Issue testing user-defined exception when imported from module into __init__.py
我正在尝试编写一个分成多个文件的大模块,同时将其统一在一个逻辑模块中,如 Ch. 10 of the Python Cookbook
中所述
但是,在我的单元测试中,我在测试异常时收到意外错误。当我试图强制异常时,我希望引发异常 package.MyExceptionError
。但是,我的测试失败了,因为我收到异常 package.module.MyExceptionError
。另一方面,当我从通过 __init__.py
导入的模块调用函数时,我能够按预期将其调用为 package.my_function()
。
我已经查看了几个布局相似的 PyPi 模块的代码,但我无法确定我做错了什么,或者我误解了它应该如何工作?
下面是一个虚拟包,其中包含复制问题所需的最少代码。
我的文件结构是:
Spam/
spam/
__init__.py
eggs.py
test/
test_eggs.py
以下是spam/eggs.py
的内容:
class EggError(Exception):
pass
def egg(b=True):
if b == True:
return 0
else:
raise EggError('Spam!')
if __name__ == '__main__':
pass
以下是spam/__init__.py
的内容:
from .egg import egg
from .egg import EggError
__all__ = ['egg', 'EggError', ]
if __name__ == '__main__':
pass
这里是test/test_spam.py
的内容:
import unittest
import spam
class Test(unittest.TestCase):
def test_egg(self):
self.assertEquals(spam.egg(), 0)
def test_EggError(self):
self.assertRaises(spam.EggError, spam.egg(False))
if __name__ == "__main__":
unittest.main()
这些是我 运行 测试时得到的结果:
Finding files... done.
Importing test modules ... done.
======================================================================
ERROR: test_EggError (test.test_spam.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "K:\Scripting\Python\err_test\test\test_spam.py", line 11, in test_EggError
self.assertRaises(spam.EggError, spam.egg(False))
File "K:\Scripting\Python\err_test\spam\eggs.py", line 12, in egg
raise EggError('Spam!')
spam.eggs.EggError: Spam!
----------------------------------------------------------------------
Ran 2 tests in 0.415s
FAILED (errors=1)
您在 assertRaises()
有机会捕获异常之前调用 spam.egg()
。您应该按如下方式编写该测试:
self.assertRaises(spam.EggError, spam.egg, False)
assertRaises()
会为您打电话spam.egg()
。
如果您觉得这难以阅读,您可以改用上下文管理器样式:
with self.assertRaises(spam.EggError):
spam.egg(False)
我正在尝试编写一个分成多个文件的大模块,同时将其统一在一个逻辑模块中,如 Ch. 10 of the Python Cookbook
中所述但是,在我的单元测试中,我在测试异常时收到意外错误。当我试图强制异常时,我希望引发异常 package.MyExceptionError
。但是,我的测试失败了,因为我收到异常 package.module.MyExceptionError
。另一方面,当我从通过 __init__.py
导入的模块调用函数时,我能够按预期将其调用为 package.my_function()
。
我已经查看了几个布局相似的 PyPi 模块的代码,但我无法确定我做错了什么,或者我误解了它应该如何工作?
下面是一个虚拟包,其中包含复制问题所需的最少代码。
我的文件结构是:
Spam/
spam/
__init__.py
eggs.py
test/
test_eggs.py
以下是spam/eggs.py
的内容:
class EggError(Exception):
pass
def egg(b=True):
if b == True:
return 0
else:
raise EggError('Spam!')
if __name__ == '__main__':
pass
以下是spam/__init__.py
的内容:
from .egg import egg
from .egg import EggError
__all__ = ['egg', 'EggError', ]
if __name__ == '__main__':
pass
这里是test/test_spam.py
的内容:
import unittest
import spam
class Test(unittest.TestCase):
def test_egg(self):
self.assertEquals(spam.egg(), 0)
def test_EggError(self):
self.assertRaises(spam.EggError, spam.egg(False))
if __name__ == "__main__":
unittest.main()
这些是我 运行 测试时得到的结果:
Finding files... done.
Importing test modules ... done.
======================================================================
ERROR: test_EggError (test.test_spam.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "K:\Scripting\Python\err_test\test\test_spam.py", line 11, in test_EggError
self.assertRaises(spam.EggError, spam.egg(False))
File "K:\Scripting\Python\err_test\spam\eggs.py", line 12, in egg
raise EggError('Spam!')
spam.eggs.EggError: Spam!
----------------------------------------------------------------------
Ran 2 tests in 0.415s
FAILED (errors=1)
您在 assertRaises()
有机会捕获异常之前调用 spam.egg()
。您应该按如下方式编写该测试:
self.assertRaises(spam.EggError, spam.egg, False)
assertRaises()
会为您打电话spam.egg()
。
如果您觉得这难以阅读,您可以改用上下文管理器样式:
with self.assertRaises(spam.EggError):
spam.egg(False)