2012-01-20 33 views
11

Tôi đang cố gắng sử dụng bản vá để trả về một Mô hình từ bên trong một phương thức. Cấu trúc cơ bản như sau:Bản vá giả không hoạt động với lớp học trong __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() 

Đoạn mã trên hoạt động tốt cho tôi. Tuy nhiên, khi tôi áp dụng cùng một mẫu cho mã thực mà tôi đang thử nghiệm, đối tượng thực sự (không phải đối tượng giả) được trả về trong phương thức đang được thử nghiệm. Tôi không thể thấy bất kỳ sự khác biệt nào. Chỉ nghĩ rằng có một chút khác biệt là lớp thực được xác định trong tệp init .py. Tôi không chắc liệu điều này có tạo nên sự khác biệt hay không? Có ai thấy điều này trước đây không?

Lưu ý: các lib thực tế là twilio 3.3.5 và tôi đang sử dụng Python 2.6.5 và 1.3.1 Django và Mock 0.7.2

+1

Bạn có thể cần đăng mã không hoạt động, thay vì mã. –

+0

@DanielRoseman rất hợp lệ. Lý do mà tôi sử dụng phương pháp này là tôi thấy rất ít người sẽ có gói twilio và có thể không muốn cài đặt nó (mặc dù đây không phải là vấn đề lớn nếu bạn đang sử dụng virtualenv), và tôi muốn chứng minh rằng tôi đã hiểu nguyên tắc cơ bản của những gì tôi cần làm. Cảm ơn vì đã trả lời. –

Trả lời

11

I figured it out. Nó không có gì để làm với tập tin __init__.py. Đó là (như thường lệ) lỗi của tôi! :)

Chỉ cần cho bất cứ ai đó là mỗi cố gắng sử dụng Mock và vá với Twilio và tin nhắn SMS trong tương lai, đây là giải pháp:

Tôi đã Mocking các twilio.rest.TwilioRestClient lớp Nhưng, mọi thứ đang bị xiềng xích cùng nhau và tôi cần phải gọi bản vá trên lớp bên trong có tên là SmsMessage. Vì vậy, để thử nghiệm đơn vị của tôi, công trình này hoạt động tốt:

@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) 

lưu ý: send_sms thực sự là chức năng mà tôi đang thử nghiệm. Tôi chỉ muốn chắc chắn rằng nó đã được gọi twilio như mong đợi và cung cấp default_from_number. Giá trị default_from_number được định nghĩa trong tệp cài đặt và không thực sự quan trọng đối với ví dụ này.