python 2.7 - 无法弄清楚如何使用mock

时间:2017-05-12 12:48:12

标签: python mocking python-unittest python-mock sendgrid-api-v3

使用mock的新手。在python 2.7.13。

我在这个图书馆周围建立一个包装器 https://github.com/sendgrid/sendgrid-python/blob/master/sendgrid/sendgrid.py

反过来使用这个库来进行任何REST调用 https://github.com/sendgrid/python-http-client/blob/master/python_http_client/client.py

我的测试代码看起来像

class TestSendgridUtils(unittest.TestCase):
    def setUp(self):
        self.sgsu = SubUser(api_key=RANDOM_API_KEY, hippo_user=RANDOM_USER_OBJ)

    @patch('sendgrid.SendGridAPIClient')
    @patch('python_http_client.Client')
    def test_create(self, sgc_mock, http_client_mock):
        self.sgsu.create()
        expected_data = {
            'email' : self.sgsu.sg_username
        }
        print http_client_mock.call_list()
        sgc_mock.client.assert_called_with(request_body=expected_data)

我基本上试图模拟进行HTTP调用的底层库。我的测试只是为了确保我将正确的参数传递给sendgrid模块。

现在,如果我运行测试,仍然会发出HTTP请求,这意味着我没有成功模拟目标库。

阅读模拟文档我理解补丁只适用于我实例化底层类的地方。但这必须在setUp()中,这意味着我的测试案例中不能提供我的模拟?

因此,我无法弄清楚在这种情况下我如何使用mock的最佳做法。 我也无法弄清楚我是否可以嘲笑" sendgrid.SendGridAPIClient'或者如果我需要模拟' python_http_client.Client'

1 个答案:

答案 0 :(得分:0)

您应该在模块中使用patch个对象(例如app.py),而不是定义它们的位置。
因此,您对patch的调用应如下所示:

@patch('app.sendgrid.SendGridAPIClient')

@patch('sendgrid.SendGridAPIClient')

你的嘲笑顺序也不匹配:

@patch('sendgrid.SendGridAPIClient')
@patch('python_http_client.Client')
def test_create(self, sgc_mock, http_client_mock):

您必须切换到patch或切换方法参数,因为现在@patch('sendgrid.SendGridAPIClient')对应http_client_mock@patch('python_http_client.Client')对应sgc_mock