Jest模拟SendGrid发送电子邮件

5
我在我的nodejs应用程序中使用sendGrid电子邮件服务。 详见:https://github.com/sendgrid/sendgrid-nodejs/tree/master/packages/mail 基本上,当用户注册时,我会发送欢迎电子邮件。但是,当我为用户注册编写测试时,我想模拟sendgrid发送功能。我应该如何使用jest来实现它?或者,请给予测试注册api的任何建议。
2个回答

6

针对JavaScript/Node版本的SendGrid,我们添加了以下内容:

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 }

为了使其与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();
});

这使我们能够在测试中添加 beforeEach(() => mockMailer());。值得注意的是,我们只在使用sendgrid发送邮件时使用sendMultiple()函数,您可能在应用程序中使用了不同的函数。


你设置了 API 密钥吗?如果你使用 dotenv,请记得为测试环境设置它。 - coinhndp
@coinhndp 是的,API密钥已设置并且在测试和开发中保持不变,NODE_ENV会随脚本设置。我不确定决定性的区别是没有使用驼峰命名法还是将“enabled”更改为“enable”。 - Greyphilosophy
@coinhndp,它可能会默默地不启用沙盒模式,因此电子邮件将被发送,或者它会给出“错误请求”响应,并且无论是从测试还是从生产中都不会发送任何电子邮件。今天我的一位同事使用jest.mock()编写了一个解决方案,我将在答案中更新她所写的内容。 - Greyphilosophy
太好了。我们也可以模拟发送电子邮件。 - coinhndp

4
您可以使用Sendgrid的沙盒模式来避免实际发送邮件。

第二个链接已经失效。因此,我们建议您至少添加引用的片段。 - Fortune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接