2014-09-13 3 views
0

필자는 파이썬 mock을 사용하지 않았습니다.조롱 된 객체가 반환 한 객체를 조롱하는 방법은 무엇입니까?

분명히 나는 ​​다음과 같은 방법으로 실제 방법 requests.post()를 호출하는 내 테스트 코드를 원하지 않는, 그래서 대신 행동을 조롱하려는 :

def try_post(self, url, body): 
    r = requests.post(url, data=body) 
    msg = str(r.status_code) + " " + r.content + "\n" 
    if r.status_code >= 300: 
     sys.stderr.write("Error: POST returned " + msg) 

내 질문 : 어떻게 객체를 조롱 않습니다 응답 객체 인 requests.post()에 의해 반환됩니까?

예를 들어, r.status_code가 200이고 r.status_code가 300 인 테스트를 작성하여 조건부 로직을 테스트 할 수 있습니다. 또한 일부 문자열을 반환하려면 r.content를 조롱해야합니다.

내 비 작동 코드는 다음과 같습니다 r.status_code 및 r.content 객체가 아닌 문자열을 mock.MagicMock을 평가하기 때문에

from monitor_writer import MonitorWriter 
import mock 
import unittest 

class TestMonitorWriter(unittest.TestCase): 

    @mock.patch('monitor_writer.requests') 
    def test_conforming_write(self, mock_requests): 
     xml_frag = """ 
<InstantaneousDemand> 
</InstantaneousDemand> 
""" 
     mock_requests.status_code.return_value = 200 
     mock_requests.content.return_value = "OK" 

     writer = MonitorWriter() 
     writer.update(xml_frag) 
     self.assertTrue(mock_requests.post.called, "Failed to call requests.post") 

이 테스트는 TypeError: expected a character buffer object에 실패하고 try_post() 메소드에 시도 그들을 연결하십시오. 우리는 당신이 실제로 호출하는 기능을 조롱하면

class TestMonitorWriter(unittest.TestCase): 

    @mock.patch('monitor_writer.requests.post') 
    def test_conforming_write(self, mock_post): 
     xml_frag = """ 
<InstantaneousDemand> 
</InstantaneousDemand> 
""" 
     response = mock.MagicMock() 
     response.status_code = 200 
     respone.content = "OK" 
     mock_post.return_value = response 

     writer = MonitorWriter() 
     writer.update(xml_frag) 
     self.assertTrue(mock_post.called, "Failed to call requests.post") 

, 우리는 모의 응답 객체를 생성에 status_codecontent을 설정

답변

2

당신은 오히려 전체 requests 모듈보다 직접 requests.post을 조롱 할 원하는 값에 대한 조롱 된 응답을 보내고, 조롱 한 응답을 우리 조롱받은 post 함수의 return_value에 할당합니다.

+0

이제 나는 그것을 보았고, 그렇게 많은 의미가 있습니다. 그리고 그것은 작동합니다. 나를 똑바로 세워 줘서 고마워. (FWIW, 내가 읽은 튜토리얼 및 빠른 시작에서 찾을 수 없었습니다.) –

관련 문제