2014-10-02 1 views
1

함수에 대한 모든 참조를 파이썬에서 모의 ​​객체로 대체하는 방법은 무엇입니까?함수를 파이썬에서 unittesting을위한 mock 객체로 바꾸는 방법

패브릭 스크립트에 대한 unittest를 작성하려고합니다. 특히 fabric.api.run을 실행 대신 명령을 기록한 mock 버전으로 바꾸고 싶습니다. 그러나 필자는이 방법을 사용하여 원단을 참조하는 모든 코드를 다시 작성할 필요가 없습니다.

import fabric.api 
_run = fabric.api.run 
fabric.api.run = my_mock_run_function 

을하지만 다른 모듈 fabric.api을 가져 오기 전에이 실행됩니다 보장 할 수 없기 때문에, 많은 코드는 여전히 실제 run 기능을 사용하고 있습니다 :

나는 일을 시도했습니다.

from fabric.api import run 

당신이 당신의 모듈이 실행 기능의있는 로컬 참조 패치해야합니다 : 사용 unittest.mock.patch

import fabric.api 
import unittest 
from unittest.mock import Mock, patch 

class TestCases(unittest.TestCase): 
    @patch('fabric.api.run') 
    def test_test(self): 
     self.assertTrue(True) 

답변

0

@patch('yourmodule.run') 
def test_method(self, run): 
    pass 

만약 당신의 코드 사용 :

,210
import fabric.api 
... 
api.run(...) 

당신이 원본을 패치 할 수있을 것입니다 :

@patch('fabric.api.run') 
def test_method(self, run): 
    pass 

this nice explanation를 참조하십시오.

+1

'mock'은 파이썬 3.3 이전의 [타사 모듈] (http://www.voidspace.org.uk/python/mock/index.html)입니다. OP는 아마도 그가 제공 한 샘플 코드에서'patch = '에 대한 키워드 인수로'new = my_mock_run_function'을 원할 것이다. – dano

+1

솔루션을 사용하여'fabric.api'를 패치 할 수 있었지만 네이티브'fabric.api.run' 함수가 여전히 호출되어 테스트 중간에 ssh를 통해 연결을 시도합니다. 어떻게 이것을 피할 수 있습니까? – amhed

+0

'fabric.api.local'과 동일한 문제가 있습니다.이 해결책은 작동하지 않습니다. – giorgiosironi