如果缺少包,如何测试导入是否引发 ImportError?

问题描述 投票:0回答:1

我正在编写一个模块,它可以将

pandas
作为可选包。
my_submodule.py
文件顶部的导入语句如下所示。

try:
    import pandas as pd
except (ImportError, ModuleNotFoundError):
    pd = None

现在我想测试

pandas
没有安装并且
ImportError
ModuleNotFoundError
被提出。

如何做到这一点?

目前我的测试文件是这样的:

from unittest import TestCase
from unittest.mock import patch

def test_no_pandas_import():

    with patch('sys.path', []):
        from my_module import my_submodule
        assert my_submodule.pd is None

但是断言不是真的,导入了 pandas 并且没有检查错误。

python mocking python-unittest
1个回答
0
投票

在我的系统中,我创建了您的文件

my_submodule.py
,在模块
my_module
.

我已经将你的测试函数

test_no_pandas_import()
引入到后面的测试类中(在文件
test_pandas_exception.py
中):

class MyTestCase(TestCase)

所以测试代码变成如下:

from unittest import TestCase, main
from unittest.mock import patch

class MyTestCase(TestCase):

    def test_no_pandas_import(self):
        with patch('sys.path', []):
            # ---------> Note the followed instruction <---------------
            with self.assertRaises(ModuleNotFoundError):
                from my_module import my_submodule
                assert my_submodule.pd is None


if __name__ == '__main__':
    main()

我的测试代码和你的测试代码的主要区别在于我添加了指令:

with self.assertRaises(ModuleNotFoundError):

如果我在我的系统中执行测试方法

test_no_pandas_import()
,它会通过,但是如果我删除你的指令:

with patch('sys.path', []):

测试失败,输出如下:

F
======================================================================
FAIL: test_no_pandas_import (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/path/to/stack_overflow/test_pandas_exception.py", line 10, in test_no_pandas_import
    assert my_submodule.pd is None
AssertionError: ModuleNotFoundError not raised

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (failures=1)

希望这个回答对你有用

© www.soinside.com 2019 - 2024. All rights reserved.