我有一些使用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
});
});
所以我的问题是我如何模拟模块返回的类实例的方法?
答案 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());