2015-02-05 76 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