2015-02-05 73 views
0

我有以下代码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个案?

回答

0

我已经改变了我的代码看起来像

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语句了一下。

2

有可能与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