Jest 模拟 sendgrid 发送电子邮件

co*_*ndp 5 node.js sendgrid jestjs

我在我的 Nodejs 应用程序中使用 sendGrid 电子邮件

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

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

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

Gre*_*phy 6

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

mail_settings: {
      sandbox_mode: {
          enable: process.env.NODE_ENV === 'test',
      },
  }
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

该解决方案来自coinhndp以及来自github的语法附加信息。它之所以有效,是因为当我们运行npm test脚本时,将环境设置为'test',然后设置为sandbox_mode { enable: true }

为了让它与 jest 一起工作,我们有一个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();
});
Run Code Online (Sandbox Code Playgroud)

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


co*_*ndp 4

您可以使用 sendgrid 的沙箱模式来避免实际发送电子邮件