用开玩笑来模拟nodemailer.createTransport.sendMail

时间:2018-11-21 21:14:36

标签: node.js unit-testing mocking jestjs nodemailer

我有一些使用nodemailer模块的代码。

在路由器(router.js)中,我有

const transporter = nodeMailer.createTransport(emailArgs);

然后在路线(/login)里面,我有

...
return transporter.sendMail(mailOptions);

我正在尝试使用jest测试框架来测试此路由。我在模拟对sendMail的呼叫时遇到了一些麻烦。我读过this nice blogpost有关如何使用笑话嘲讽的信息,但出现此错误:

  

TypeError:无法读取未定义的属性“ sendMail”

实际上,当我检查transporter的值时,它是不确定的。

这是我的测试代码(无效):

import request from "supertest";
import router from "./router";

jest.mock("nodemailer");

describe("", () => {
...

    test("", async () => {
        // 1 - 200 status code; 2 - check email was sent
        expect.assertions(2);

        const response = await request(router)
            .post("/login")
            // global variable
            .send({ "email": email })
            .set("Accept", "application/json")
            .expect("Content-Type", /json/);

        // should complete successfully
        expect(response.status).toBe(200);
        // TODO not sure how to express the expect statement here
    });
});

所以我的问题是我如何模拟模块返回的类实例的方法

3 个答案:

答案 0 :(得分:1)

为了模拟 nodemailer 模块,我做了

jest.mock('nodemailer', () => ({
  createTransport: jest.fn().mockReturnValue({
    sendMail: jest.fn().mockReturnValue((mailoptions, callback) => {})
  })
}));

就像一个魅力

答案 1 :(得分:0)

我遇到了同样的问题,找到了解决方案。这是我发现的:

使用class Configuration { function __construct() {} $db = array ( 'setting' => 'value' ); } class Functions { function __construct() {} public function bar() { return "foo"; } } class Templates { function __construct() {} .. see the load_template_file method above .. } 告诉您开玩笑用自动模拟替换jest.mock("nodemailer");。这意味着nodemailer的每个属性都将替换为空的模拟函数(类似于nodemailer)。

这就是您收到错误jest.fn()的原因。 为了拥有一些有用的东西,您必须定义TypeError: Cannot read property 'sendMail' of undefined的模拟功能。

在我们的情况下,我们将不希望拥有具有属性nodemailer.createTransport的对象。我们可以使用sendMail来做到这一点。由于您可能想测试是否调用了nodemailer.createTransport.mockReturnValue({"sendMail": jest.fn()});,因此最好事先创建该模拟函数。

这是您的测试代码的完整示例:

sendMail

答案 2 :(得分:0)

好吧,我仍然希望我的邮件收发器正常工作,并且返回undefined无效,所以我不得不将sendMailMock更改为:

const sendMailMock = jest.fn((mailOptions, callback) => callback());