Python测试:模拟导入错误
问题描述:
我有以下代码Python测试:模拟导入错误
try:
from foo_fast import bar
except ImportError
from foo import bar
def some_function(a, b):
return foo(a, b)
我现在要测试的两种情况foo_fast
可以进口,它不能。
使用pytest和pytest-模拟,我自然要封装在一个pytest固定两种情况,所以我想我会用
@pytest.fixture(params=(True, False))
def use_fast(request, mock):
if request.param is not True:
mock.patch("foo_fast.bar", side_effect=ImportError)
return request.param
def test_foo(use_fast):
assert some_function(1, 2)
但是似乎import语句测试之前只运行一次开始,所以我不能嘲笑ImportError
。
如何模拟这些ImportError
个案?
答
我已经改变了我的代码看起来像
try:
import foo_fast as foo
except ImportError
import foo
def some_function(a, b):
return foo.bar(a, b)
,现在可以测试它喜欢。
@pytest.fixture(params=(True, False))
def use_fast(request, monkeypatch):
if request.param:
import foo
import foo_fast
monkeypatch.setattr(foo_fast, 'bar', foo.bar)
return request.param
def test_foo(use_fast):
assert some_function(1, 2)
这并不测试try ... except ImportError
但我想这将是不可能的反正。
注意
from foo import bar
不能以这种方式monkeypatched,所以我不得不改变import语句了一下。
答
有可能与mock库:
def test_import_error(self):
with mock.patch.dict('sys.modules', {'foo_fast.bar': None}):
# your tests with foo.bar
在这种情况下from foo_fast import bar
会引发ImportError
。