2012-01-20 40 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() 

上面的代碼適合我。但是,當我將相同的模式應用於我試圖測試的實際代碼時,真正的對象(不是模擬的)將返回到正在測試的方法中。我看不出有什麼不同。唯一有點不同的是,真實的類是在init .py文件中定義的。我不確定這是否有所作爲?有沒有看過這個?

注:實際LIB是twilio 3.3.5,我使用Python 2.6.5和1.3.1的Django和Mock 0.7.2

+1

您可能需要發佈不工作的代碼,而不是代碼。 –

+0

@DanielRoseman非常有效的一點。我使用這種方法的原因是,我認爲很少有人會擁有twilio軟件包,並且可能不想安裝它(儘管如果您使用的是virtualenv,這並不是什麼大問題),並且我想表明我明白了我需要做的基本原則。感謝您的回覆。 –

回答

11

我想通了。它與__init__.py文件無關。這是(和往常一樣)我的錯! :)

只是爲了任何人,是每一個試圖在將來使用模擬和補丁與Twilio和短信,這裏是解決方案:

我在嘲笑類twilio.rest.TwilioRestClient但是,事情是鏈接在一起,我需要調用名爲SmsMessage的內部類的補丁。所以,對於我的單元測試,這工作得很好:

@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在設置文件中定義,對於此示例並不重要。