从模块导入到初始化时发出测试用户定义的异常

2024-04-27 02:37:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个大模块编写成多个文件,同时将其统一到一个逻辑模块中,如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)

Tags: 模块pytestimportselfpackage内容if
1条回答
网友
1楼 · 发布于 2024-04-27 02:37:41

assertRaises()有机会捕获异常之前调用spam.egg()。您应该按照以下方式编写测试:

self.assertRaises(spam.EggError, spam.egg, False)

assertRaises()将为您呼叫spam.egg()。你知道吗

如果您觉得这很难理解,可以改用上下文管理器样式:

with self.assertRaises(spam.EggError):
    spam.egg(False)

相关问题 更多 >