Python 如何在导入包时模拟 ImportError

标签 python python-3.x testing mocking

<分区>

我有一个安装了可选库的包。当可选库不存在并且调用特定方法时,会引发自定义异常,说明在没有安装可选包的情况下无法启用该功能。如果存在可选库,则可以使用该方法。

我想用 pytest 测试这两种情况。

我正在导入如下库:

try:
    import derp
except ImportError:
    pass

然后在函数中通过检查包是否在 sys.modules 中来检查是否安装了库。

def my_feature_method():
    if 'derp' not in sys.modules:
        raise Exception('this feature requires the derp package to be installed')

    # do some stuff ...

我希望能够测试在 pytest 中安装了包没有 安装的情况。

编辑

目前我正在使用

with mock.patch.dict('sys.modules'):
    del sys.modules['derp']
    # run test

但这实际上并没有测试是否引发了 ImportError。出于保险原因,我想要这个 😎

最佳答案

好吧,我通过稍微更改设置解决了这个问题:

def try_import(name, package=None):
    try:
        return importlib.import_module(name, package=package)
    except ImportError:
        pass

derp = try_import('derp')

if not globals()['derp']:
    raise Exception('this feature requires the derp package to be installed')

这意味着两件事:

  1. 我可以单独测试try_import函数。

  2. 我可以像 mock.patch('__main__.derp', None)

  3. 这样简单地修补名称

关于Python 如何在导入包时模拟 ImportError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239407/

相关文章:

python - 在 Tensorflow 中设置交集

python - PyQt5 - 在 QTableWidget 后面更新 DataFrame

ruby-on-rails - 我的 Rspec 测试拒绝运行

python - 如何在 matplotlib 中每次单击鼠标时绘制一个点

python - 根据另一个列表对列表进行排序

python-3.x - 属性错误 : 'module' object has no attribute 'mkdirs'

python - Pytorch BiLSTM POS 标记问题 : RuntimeError: input. size(-1) 必须等于 input_size。预计6个,实测12个

python - Paramiko 会被移植到 Python 3.x 吗?

testing - 质量中心 : link to attachment

php - 通过测试中的方法传递请求