2017-10-16 3 views
0

모의 사용이 가능한 것은 단 하나뿐입니다.딥 모크 (deep mock with method replacement)

#tested.py 
from somemodule import somelogger 

class MyClass(object): 
    def __init__(self): 
     self.logger = somelogger() 

    def do_smth(self): 
     self.logger.log(message) 

중요세부 : 모듈 somemodule 그렇게 @patch 같은 일반적인 솔루션은 스위트하지 않는, 존재하지 않습니다.

#tests.py 
from tested import MyClass 


def test_logging(): 
    obj = MyClass() 
    obj.do_smth('some_message') 

콘솔에서 :

내가 그것을 somemodulesomelogger's 방법 log을 조롱 할 필요는 간단한 인쇄를 수행

some_message 

답변

0

나는이 작업을 수행 할 수있는 방법으로 unittest.mock.patch 방법을 사용하는 것입니다 생각 여기에 설명되어 있습니다 : https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch

tests.py 파일에서 조롱 된 로그 metho d 인쇄 할 것.

# tests.py 
from tested import MyClass 
from unittest.mock import patch 

def mocked_log(log_msg): 
    print(log_msg) 

@patch('tested.somelogger.log') 
def test_logging(mock_logger) 
    mock_logger.return_value = mocked_log 

    obj = MyClass() 
    obj.do_smth('some message') 
+0

이 예제를 사용해 보셨습니까? 파이썬의 어떤 버전입니까? – sann05

+0

이것은 파이썬 3.6 용입니다. 더 복잡한 시스템에서 비슷한 조롱을했는데 모든 것이 잘 작동했습니다. 2.7.x를 사용한다면 먼저 mock을 설치해야하며 unittest.mock 대신 mock을 가져와야합니다. – suripoori

+0

죄송합니다. 하나의 중요한 세부 사항을 놓치 셨습니다 : 모듈 somemodule **은 ** ** ** ** ** ** exist **가 아닙니다 **. 그래서 우리가 가져 오기를 시도 할 때, 우리는 항상 ImportError를 얻습니다 : 모듈은 ** somemodule ** – sann05