2012-01-20 4 views
11

패치를 사용하여 메소드 내에서 모의 ​​객체를 반환하려고합니다. 기본 구조는 다음과 같습니다.모의 패치가 __init__.py 클래스에서 작동하지 않습니다.

MyCode.py 

class MyClass: 

    def __init__(self, first_name, last_name): 
     self.first = first_name 
     self.last = last_name 

    def get_greeting(self): 
     return 'Hello {f} {l}'.format(f=self.first, l=self.last) 


def get_new_greeting(first_name, last_name): 
    obj = MyClass(first_name, last_name) 
    return obj.get_greeting() 


my_code_test.py 

import unittest 
from mock import Mock, patch 
import my_code 

class TestMyCode(unittest.TestCase): 
    def setUp(self): 
     pass 

    @patch('my_code.MyClass') 
    def test_get_greeting(self, MockClass): 
     instance = MockClass.return_value 
     mock_greeting = 'Hello Me' 
     instance.get_greeting.return_value = mock_greeting 

     greeting = my_code.get_new_greeting('john', 'doe') 
     self.assertEqual(greeting, mock_greeting) 


if __name__ == '__main__': 
    unittest.main() 

위 코드는 저에게 잘 작동합니다. 그러나 테스트 할 실제 코드에 동일한 패턴을 적용하면 실제 객체 (모의 객체가 아닌)가 테스트중인 메소드에 반환됩니다. 나는 어떤 차이도 볼 수 없다. 유일한 차이점은 실제 클래스가 .py 파일에 정의되어 있다는 것입니다. 이것이 차이를 만들지 모르겠다. 이전에 본 적이 있습니까?

주 : 실제 LIB는 twilio 3.3.5이고 나는 그것을 알아 냈 파이썬 2.6.5 장고 1.3.1 및 모의 0.7.2

+1

코드가 아닌 작동하지 않는 코드를 게시해야 할 수도 있습니다. –

+0

@DanielRoseman 매우 유효한 포인트. 내가이 접근법을 사용한 이유는 twilio 꾸러미를 갖고있는 사람들이 거의 없을 것이라고 생각했기 때문입니다 (비록 virtualenv를 사용한다면 큰 문제는 아니지만) twilio 패키지를 설치하지 않으려 고 할지도 모릅니다. 내가해야 할 일의 기본 원칙. 답장을 보내 주셔서 감사합니다. –

답변

11

을 사용하고 있습니다. 그것은 __init__.py 파일과 아무 관련이 없습니다. 내 잘못 이었어!

내가 클래스 twilio.rest.TwilioRestClient 비웃음 그러나 한 상황이 체인됩니다 :) 그냥 모든 미래에 Twilio 및 SMS와 모의 및 패치를 사용하려고하는 사람을위한

, 여기에 솔루션입니다 함께 그리고 SmsMessage라는 내부 클래스에서 patch를 호출해야했습니다. 따라서 단위 테스트를하려면 다음을 수행하십시오.

@patch('twilio.rest.resources.SmsMessages') 
def test_send_msg_valid_args(self, MockClass): 
    instance = MockClass.return_value 
    instance.create.return_value = None 
    to_number = '+15555555555' 
    msg = 'Hello world' 
    send_sms(to_number, msg) 

    instance.create.assert_called_once_with(to=to_number, body=msg, from_=default_from_number) 

참고 : send_sms는 실제로 테스트하려는 기능입니다. 예상 한대로 twilio를 호출하고 default_from_number를 제공했는지 확인하려고했습니다. 값 default_from_number는 설정 파일에 정의되어 있으며이 예제에서는별로 중요하지 않습니다.

관련 문제