我有一个安装了可选库的软件包。当不存在可选库并调用特定方法时,会引发一个自定义异常,说明如果未安装可选软件包,则不会启用该功能。如果存在可选库,则可以使用该方法。
我想用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
被引发。出于覆盖原因,我想要
答案 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')
这意味着两件事:
我可以分别测试try_import
函数。
我可以简单地打上mock.patch('__main__.derp', None)
答案 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')