0

新使用模拟。在 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() 中,这意味着我的模拟在我的测试用例中不可用?

结果,我无法弄清楚在这种情况下如何使用模拟的最佳实践是什么。我也不知道我是否可以模拟“sendgrid.SendGridAPIClient”或者我是否需要模拟“python_http_client.Client”

4

1 回答 1

0

您应该patch在使用它们的模块中(例如 in 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

于 2017-08-18T14:07:36.320 回答