2011-05-16 3 views
4

저는 py.test를 사용하고 테스트 함수에 객체를 주입하는 funcarg 접근법을 정말 좋아합니다. 필자가 테스트 한 결과, 외부 의존성이 많았 기 때문에 모의 객체로 작업해야한다. monkeypatch를 사용하여 mock 객체로 특정 속성을 대체합니다.py.test 커스텀 funcargs에서 monkeypatch 사용

내가 가진 문제는 특정 funcarg을 사용하고 항상 동일한 속성을 패치해야한다는 테스트가 자주 발생한다는 것입니다. 지금까지 모든 테스트 함수에서 속성을 대체했습니다.

funcarg 함수에서 monkeypatch를 사용하고 개별 테스트에서이 중복 코드를 제거 할 수 있습니까?

import sys 
import pytest 
from mock import Mock 


#---------------------------------------------------------------------- 
def pytest_funcarg__api(request): 
    """""" 
    api = myclass() 
    #do some initialisation... 
    return api 


#---------------------------------------------------------------------- 
def test_bla1(monkeypatch, api): 
    """""" 
    monkeypatch.setattr(api,"get_external_stuff",Mock()) 
    monkeypatch.setattr(api,"morestuff",Mock()) 

    api.do_something1() 
    assert not api.a 

#---------------------------------------------------------------------- 
def test_bla2(monkeypatch, api): 
    """""" 
    monkeypatch.setattr(api,"get_external_stuff",Mock()) 
    monkeypatch.setattr(api,"morestuff",Mock()) 

    api.do_something2() 
    assert api.b 


if __name__=='__main__': 
    pytest.main(args=["-v",sys.argv[0]]) 

답변

6

당신은 문서화 getfuncargvalue 기능을 사용할 수 있습니다 :

def pytest_funcarg__api(request): 
    api = myclass() 
    #do some initialisation... 
    mp = request.getfuncargvalue("monkeypatch") 
    mp.setattr(api,"get_external_stuff", Mock()) 
    mp.setattr(api,"morestuff", Mock()) 
    return api 
+0

나는 이것이 더 우아하다는 것에 동의한다. 어떻게 든이 문서를 읽을 때 이것을 놓쳤습니다 ... – circus

2

이 작동합니다 :

  1. 우리는 config.pluginmanager를 사용하여 monkeypatch 플러그인을 얻을 :

    def pytest_funcarg__api(request): 
        """""" 
        api = myclass() 
        #do some initialisation... 
        mp_plugin = request.config.pluginmanager.getplugin("monkeypatch") 
        monkeypatch = mp_plugin.pytest_funcarg__monkeypatch(request) 
        monkeypatch.setattr(api,"get_external_stuff",Mock()) 
        monkeypatch.setattr(api,"morestuff",Mock()) 
        return api 
    

    여기에 트릭은 두 가지입니다.

  2. monkeypatch 플러그인은 py.test의 의존성 주입 코드에 의해 호출 된 것으로 우리의 고유 한 요청 객체를 사용하여 pytest_funcarg__monkeypatch() funcarg-interface를 호출하여 속일 수 있습니다. 내부적으로 다른 함수 인수의 공장에서 함수 인수를 사용에
+0

감사합니다, 잘 작동합니다. – circus