栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Python中模拟SendGrid方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Python中模拟SendGrid方法

说明

必须根据要测试的地方而不是在实现方法的地方实施模拟。或者,同样在您的情况下,

sg
无法从unittest中模拟对象。

因此,我不确定您项目的结构是什么。但是希望这个例子有帮助。

您需要确保还引用了要模拟的类所在的适当位置,以正确模拟其方法。

因此,让我们假设您正在从test.py运行测试:

test.py    your_app/        views.py    tests/        all_your_tests.py

在views.py内部,您要像这样导入发送:

from module_holding_your_class import SendGridClient

因此,要查看您的mock.patch,它应如下所示:

@mock.patch('your_app.views.SendGridClient.send')def test_add_user_page_loads(self, mocked_send):

如您所见,您是从test.py运行的,因此您的导入是从那里引用的。我在这里建议相对于实际运行实际代码的位置运行测试,这样就不必弄乱导入。

此外,您正在嘲笑

send
在views.py中调用的。

那应该工作。让我知道怎么回事。

额外信息:类的模拟实例

因此,根据您的代码,如果您实际上模拟了类的实例,则可能对您更有利。这样,您可以非常轻松地在

SendGridClient
或实例的单个模拟中测试所有方法
Mail
。这样,您可以专注于方法的显式行为,而不必担心外部函数的功能。

要完成模拟一个Class实例(或者在您的情况下为两个实例)的过程,您将必须执行以下操作(内联说明)

*此特定示例未经测试,可能尚未完成。目的是使您了解如何操纵模拟和数据以帮助您进行测试。

在下面,我有一个经过充分测试的示例可以使用。*

@mock.patch('your_app.views.Mail')@mock.patch('your_app.views.SendGridClient')def test_add_user_page_loads(self, m_sendgridclient, m_mail):    # get an instance of Mock()    mock_sgc_obj = mock.Mock()    mock_mail_obj = mock.Mock()    # the return of your mocked SendGridClient will now be a Mock()    m_sendgridclient.return_value = mock_sgc_obj    # the return of your mocked Mail will now be a Mock()    m_mail.return_value = mock_mail_obj    # Make your actual call    resp = self.client.post('/add_user', data={ 'email': 'joe@hotmail.com'        }, follow_redirects=True)    # perform all your tests    # example    self.assertEqual(mock_sgc_obj.send.call_count, 1)    # make sure that send was also called with an instance of Mail.    mock_sgc_obj.assert_called_once_with(mock_mail_obj)

根据您提供的代码,我不确定到底

Mail
返回了什么。我假设它是的对象
Mail
。如果是这样,那么上面的测试用例就足够了。但是,如果要测试
message
自身的内容并确保每个对象属性中的数据正确,我强烈建议您将单元测试分开以在
Mail
类中进行处理,并确保数据表现正常。

想法是您的

add_user
方法尚不关心验证数据。只是调用了该对象。

此外,在send方法本身内部,您可以在其中进一步进行单元测试,以确保对输入到该方法的数据进行了相应的处理。这会使您的生活更加轻松。

这是我汇总并测试过的一个示例,希望有助于进一步阐明这一点。您可以将其复制粘贴到您的编辑器中并运行它。注意我对的使用

__main__
,它表示我从哪里嘲笑。在这种情况下是
__main__

另外,我将使用

side_effect
return_value
(看看我的示例)来了解两者之间的不同行为。
side_effect
将返回执行的内容。在您的情况下,您想查看执行方法send时发生的情况。

每个单元测试都以不同的方式进行模拟,并展示了您可以应用的不同用例。

import unittestfrom unittest import mockclass Doo(object):    def __init__(self, stuff="", other_stuff=""):        passclass Boo(object):    def d(self):        return 'the d'    def e(self):        return 'the e'class Foo(object):    data = "some data"    other_data = "other data"    def t(self):        b = Boo()        res = b.d()        b.e()        return res    def do_it(self):        s = Stuff('winner')        s.did_it(s)    def make_a_doo(self):        Doo(stuff=self.data, other_stuff=self.other_data)class Stuff(object):    def __init__(self, winner):        self.winner = winner    def did_it(self, a_var):        return 'a_var'class TestIt(unittest.TestCase):    def setUp(self):        self.f = Foo()    @mock.patch('__main__.Boo.d')    def test_it(self, m_d):        ''' note in this test, one of the methods is not mocked.        '''        #m_d.return_value = "bob"        m_d.side_effect = lambda: "bob"        res = self.f.t()        self.assertEqual(res, "bob")    @mock.patch('__main__.Boo')    def test_them(self, m_boo):        mock_boo_obj = mock.Mock()        m_boo.return_value = mock_boo_obj        self.f.t()        self.assertEqual(mock_boo_obj.d.call_count, 1)        self.assertEqual(mock_boo_obj.e.call_count, 1)    @mock.patch('__main__.Stuff')    def test_them_again(self, m_stuff):        mock_stuff_obj = mock.Mock()        m_stuff.return_value = mock_stuff_obj        self.f.do_it()        mock_stuff_obj.did_it.assert_called_once_with(mock_stuff_obj)        self.assertEqual(mock_stuff_obj.did_it.call_count, 1)    @mock.patch('__main__.Doo')    def test_them(self, m_doo):        self.f.data = "fake_data"        self.f.other_data = "some_other_fake_data"        self.f.make_a_doo()        m_doo.assert_called_once_with( stuff="fake_data", other_stuff="some_other_fake_data"        )if __name__ == '__main__':    unittest.main()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625885.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号