如何在python中模拟sendgrid web api v.3方法

时间:2017-06-21 18:50:57

标签: python-3.x unit-testing mocking sendgrid

我正在尝试测试调用SendGrid方法而不发送电子邮件。当我运行我的测试时,该方法没有修补,而是运行发送电子邮件的原始方法。我不确定为什么我的补丁不起作用。此问题与How to mock a SendGrid method in Python类似,但使用不同版本的SendGrid。

# api/Login/utils_test.py
from .utils import send_email
from unittest.mock import patch

@patch('api.Login.utils.sg.client.mail.send.post')
def test_send_email(mock_mail_send):
    send_email(email, subject, html)
    assert mock_mail_send.called

# api/Login/utils.py
from api import sg

def send_email(email, subject, html):
    msg = create_email(email, subject, html)
    request_body = msg.get()
    response = sg.client.mail.send.post(request_body=request_body)

# api/__init__.py
from server import sg

# server.py
import sendgrid
import os
sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))

目前,当我从api目录中运行pytest Login/utils_test.py时,我得到一个AssertionError:

assert False
+  where False = <MagicMock name='post' id='4370000808'>.called

我希望测试没有输出。

3 个答案:

答案 0 :(得分:3)

从sendgrid-python repo问题https://github.com/sendgrid/sendgrid-python/issues/293

找到解决方法

要打包电话,因为补丁似乎不适用于SendGrid web api v.3,看起来它们不会支持它。

更新至以下内容:

# api/utils.py
def send_email(email, subject, html):
    msg = create_email(email, subject, html)
    request_body = msg.get()
    response = _send_email(request_body)
    print(response.status_code)
    print(response.body)
    print(response.headers)


def _send_email(request_body):
    """Wrapping the SendGrid mail sending method in order to patch it
    while testing. https://github.com/sendgrid/sendgrid-
    python/issues/293"""
    response = sg.client.mail.send.post(request_body=request_body)
    return response

# api/utils_test.py
@patch('api.Login.utils._send_email')
def test_send_email(mock_mail_send):
    send_email(email, subject, html)
    assert mock_mail_send.called

答案 1 :(得分:1)

另一种选择是将PrismOpen API definition结合使用。这将创建SendGrid API的本地模拟版本,以便您可以针对我们的任何端点进行测试。

然后您可以从命令行运行prism run --mock --list --spec https://raw.githubusercontent.com/sendgrid/sendgrid-oai/master/oai_stoplight.json

要让Prism自动启动,请参阅this example

答案 2 :(得分:0)

不是在Python方面,但在SendGrid方面,您是否尝试过使用sandbox mode