2015-02-05 5 views
0

나는 다음과 같은 코드를 가지고파이썬 테스트 : 시뮬레이션 ImportError를

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기구의 두 가지 상황을 캡슐화 할, 그래서 그것은 단지 시험 전에 한 번 실행되는 import 문을 보인다 그러나 나는

@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) 

를 사용하는 것이라고 생각 그래서 나는 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를 발생시킵니다.