开玩笑的模拟sendgrid发送电子邮件

时间:2019-06-18 16:00:20

标签: node.js jestjs sendgrid

我在我的nodejs应用中使用sendGrid电子邮件

https://github.com/sendgrid/sendgrid-nodejs/tree/master/packages/mail

基本上,当用户注册后,我会发送一封欢迎电子邮件

但是当我编写用户注册测试时,我想模拟sendgrid send函数。我怎么能开玩笑。或有关如何测试注册api的任何建议

2 个答案:

答案 0 :(得分:0)

我们可以使用sendgrid沙箱:

https://sendgrid.com/docs/for-developers/sending-email/sandbox-mode/

如果您使用的是nodejs,请检查以下内容:

https://github.com/sendgrid/sendgrid-nodejs/issues/612

答案 1 :(得分:0)

对于sendgrid的javascript /节点版本,我们添加了以下内容:

mail_settings: {
      sandbox_mode: {
          enable: process.env.NODE_ENV === 'test',
      },
  }

所以在上下文中看起来像这样:

const msg =  {
      to: email,
      from: EMAIL_FROM,
      subject,
      replyTo: REPLY_TO,
      dynamicTemplateData,
      templateId,
      mail_settings: {
          sandbox_mode: {
              enable: process.env.NODE_ENV === 'test',
          },
      }
  };
  sgMail.send(msg)

此解决方案来自coinhndp以及来自github的语法附加信息。之所以起作用,是因为在运行npm test时,脚本会将环境设置为'test',然后将环境设置为sandbox_mode { enable: true }

要使其开玩笑,我们有一个jestSetup.js文件:

jest.setTimeout(15000);

jest.mock('@sendgrid/mail');
const sgMail = require('@sendgrid/mail');
const defaultMailOptions = { response: 'Okay' };

beforeAll(() => {
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
});

beforeEach(() => {
  global.mockMailer = (options=defaultMailOptions) => {
    return sgMail.sendMultiple.mockImplementation(() => Promise.resolve(options));
  };
});

afterEach(() => {
  jest.clearAllMocks();
});

这允许我们将beforeEach(() => mockMailer());添加到测试中。值得注意的是,我们仅使用sendMultiple()通过sendgrid发送电子邮件,您可能在应用程序中使用了其他功能。