Python 模拟修补程序无法与_uinit__u; py.py中的类一起使用

Python 模拟修补程序无法与_uinit__u; py.py中的类一起使用,python,unit-testing,mocking,twilio,Python,Unit Testing,Mocking,Twilio,我正在尝试使用补丁从方法中返回模拟。基本结构如下: 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.

我正在尝试使用补丁从方法中返回模拟。基本结构如下:

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文件中定义的。我不确定这是否会产生影响?有人见过这个吗


注意:实际的库是Twilio3.3.5,我使用的是Python2.6.5和Django1.3.1以及Mock 0.7.2,我已经计算出来了。它与
\uuuu init\uuuu.py
文件无关。(和往常一样)是我的错!:)

对于将来尝试在Twilio和SMS中使用Mock和patch的任何人,以下是解决方案:

我在嘲笑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)

注意:发送短信确实是我要测试的功能。我只是想确保它按预期调用了twilio,并提供了默认的\u from_号码。默认值\u from\u number是在设置文件中定义的,在本例中并不重要。

您可能需要发布不起作用的代码,而不是有效的代码。@DanielRoseman非常有效。我使用这种方法的原因是,我认为很少有人会拥有twilio软件包,并且可能不想安装它(尽管如果您使用的是virtualenv,这并不是什么大问题),我想表明我理解我需要做什么的基本原则。谢谢你的回复。