2012-09-25 3 views
7

생산 단계에만 존재하는 모듈 시스템이 있다고 가정 해 보겠습니다. 테스트하는 순간에는 이러한 모듈이 존재하지 않습니다. 하지만 여전히 그 모듈을 사용하는 코드에 대한 테스트를 작성하고 싶습니다. 또한 필요한 모든 객체를 모듈에서 조롱하는 방법을 알고 있다고 가정 해 보겠습니다. 질문 : 어떻게하면 편리하게 모듈 스텁을 현재 계층에 추가합니까?존재하지 않는 모듈의 계층 구조를 조롱하려면 어떻게해야합니까?

다음은 작은 예입니다. 내가 테스트 할 기능은 actual.py라는 파일에 저장됩니다 :

actual.py: 


def coolfunc(): 
    from level1.level2.level3_1 import thing1 
    from level1.level2.level3_2 import thing2 
    do_something(thing1) 
    do_something_else(thing2) 

을 내 테스트 스위트에서 나는 이미 내가 필요한 모든 것을 가지고 내가 thing1_mockthing2_mock을 가지고 있습니다. 또한 테스트 기능이 있습니다. 현재 필요한 모듈 시스템에 level1.level2...을 추가하면됩니다. 이처럼 :

tests.py 

import sys 
import actual 

class SomeTestCase(TestCase): 
    thing1_mock = mock1() 
    thing2_mock = mock2() 

    def setUp(self): 
    sys.modules['level1'] = what should I do here? 

    @patch('level1.level2.level3_1.thing1', thing1_mock) 
    @patch('level1.level2.level3_1.thing1', thing2_mock) 
    def test_some_case(self): 
    actual.coolfunc() 

나는 등 다른 개체와 포함 된 개체와 sys.modules['level1']를 대체 할 수 있다는 것을 알고. 하지만 그것은 나를위한 많은 코드처럼 보입니다. 훨씬 간단하고 예쁜 솔루션이 있어야한다고 가정합니다. 나는 그것을 찾을 수 없다.

답변

9

아무도 내 문제를 도와주지 않았고 혼자서 해결하기로 결정했습니다. Here은 존재하지 않는 모듈에 대한 스텁을 만들 수있는 surrogate이라는 마이크로 라이브러리입니다.

해방이 같은 mock 사용할 수 있습니다 :

from surrogate import surrogate 
from mock import patch 

@surrogate('this.module.doesnt.exist') 
@patch('this.module.doesnt.exist', whatever) 
def test_something(): 
    from this.module.doesnt import exist 
    do_something() 

첫째 @surrogate 장식은 존재하지 않는 모듈에 대한 스텁을 생성 한 후 @patch 데코레이터를 변경할 수 있습니다. @patch처럼 @surrogate 데코레이터를 "복수형"으로 사용할 수 있으므로 하나 이상의 모듈 경로를 스터 빙합니다. 모든 스텁은 장식 된 기능의 수명에만 존재합니다.

누구나이 라이브러리를 사용하면 큰 일 이겠지요 :)

관련 문제