2014-07-17 2 views
0

외부 호출을하는 코드를 테스트하려고합니다. 나는 그 부름을 조롱하고 싶다. 나는이 있고, 테스트 클래스 내 설정 기능에python mock 부작용 반환 값

def mock_function(*args, **kwargs) 
    io_obj = StringIO() 
    for k,v in kwargs.iteritems(): 
     io_obj.write("{}: {}\n".format(k, v) 
    print "\n{}".format(io_obj.getvalue()) # for testing purposes 
    return io_obj 

: 호출 키워드 인수를합니다, 그래서 난 내 시험에서이 작은 도우미 함수를 작성, 내 테스트 기능에

@patch('function_to_test') 
def setUp(self, mock_dude): 
    self.mock_client = mock_dude.return_value 
    self.mock_client.function_to_test.side_effect = mock_function 
    self.client = ClientClass() 

를 I 외부 함수를 호출하는 함수를 호출 중입니다. mock_function에서 출력물을 얻었으므로이 함수를 올바르게 조롱하고 있다는 것을 알고 있습니다. 내 질문은 다음과 같습니다

mock_function에서 만든 io_obj는 어떻게 얻을 수 있습니까? 내 외부 함수는 아무것도 반환하지 않습니다.

+0

당신이 그들을 일단 당신이 키워드 인수에 대해 수행 할 수 있습니까? – dano

+0

나는 (assert_equals) io_obj의 값을 기대했던 것과 비교하고 싶다. – Mark

+1

mock은 전달 된 모든 인수를 캡처합니다. 왜 도우미가 필요하고, 왜'StringIO()'객체로 전체 무용을해야할까요? –

답변

1

Mock 개체는 실제로 호출 된 인수를 캡처하므로 수행 할 함수를 직접 작성할 필요가 없습니다. Mock.call_args을 사용하여 직접 인수에 액세스하거나 assert_called_with을 사용하여 특정 인수로 모의 객체가 호출되었다고 주장 할 수 있습니다.

예 :

>>> m = mock.Mock() 
>>> m(1,2,3) 
<Mock name='mock()' id='139905514719504'> 
>>> m.call_args 
call(1, 2, 3) 
>>> m.assert_called_with(1,2,4) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib64/python2.6/site-packages/mock.py", line 835, in assert_called_with 
    raise AssertionError(msg) 
AssertionError: Expected call: mock(1, 2, 4) 
Actual call: mock(1, 2, 3)