我有一个安装了可选库的包。当可选库不存在并且调用特定方法时,将引发一个自定义异常,说明在没有可选包安装的情况下未启用该功能。如果存在可选库,则可以使用该方法。
我想用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')

这意味着两件事:
我可以单独测试try_import函数。
我可以简单地修补名称,比如mock.patch('__main__.derp', None)

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

10-12 07:04