Python如何在导入包时模拟ImportError

时间:2018-11-10 13:26:44

标签: 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被引发。出于覆盖原因,我想要

2 个答案:

答案 0 :(得分:1)

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

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. 之类的名称

答案 1 :(得分:0)

您可以嘲笑sys.path,以防止import找到您的资料库。像

import unittest.mock
import sys
with unittest.mock.patch('sys.path', []):
    try:
        import derp
    except ImportError:
        pass
    if 'derp' not in sys.modules:
        raise Exception('missing derp')