运行模拟器时,用Mock对象替换Python对象

时间:2013-07-05 20:04:51

标签: python mocking

我创建了使用Gmail的Mail客户端。

当我在开发环境中工作时,我无法访问互联网。

所以,我创建了Mock对象,而不是将邮件发送到谷歌,将其写入本地文件夹。

它看起来像:

Class GmailSender(object):
    def Send(title,body....):
        """ Send mail to gmail """

Class MockGmailSender(object):
    def Send(title,body....):
        """ Write to file """

现在我的所有代码都是:

Gmail = GmailSender()
if Simulator:
    Gmail = MockGmailSender()

这很糟糕。

我在模块之后搜索,让我在加载服务时用我的Mock对象替换GmailSender对象,如:

if Simulator:
    replace(GmailSender,MockGmailSender)

目前,当我启动GmailSender时,实例将是MockGmailSender。

我很乐意帮助你

谢谢,

Nadav。

1 个答案:

答案 0 :(得分:1)

对于模拟类,可以使用mock.patch:

%python ./gmail.py

..

以0.033秒进行2次测试

import unittest

class GmailSender(object):

    def __init__(self):
        pass

    def Send(self, title, body):
        """ Send mail to gmail """
        content = "{0} with {1}".format(title, body)
        return content


class testGmail(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_send(self):
        gs = GmailSender()
        self.assertEqual("A with B", gs.Send("A", "B"))
        pass

    def test_mock_send(self):
        from mock import patch
        with patch('__main__.GmailSender') as gsmock:
            gs = GmailSender()
            gsmock.return_value.Send.return_value = 'B with A'
            self.assertEqual("B with A", gs.Send("A", "B"))


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