使用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'
答案 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
。