[英]TypeError when Mocking a Node Module with Jest
這里我有一個文件 mail.js,它發送 email
const nodemailer = require('nodemailer')
const mailGun = require('nodemailer-mailgun-transport')
const auth = {
auth: {
api_key: process.env.MAILGUN_API_KEY,
domain: process.env.DOMAIN
}
}
const transporter = nodemailer.createTransport(mailGun(auth))
const mailTo = (name, email) => {
const mailOptions = {
from: 'example@icloud.com',
to: 'cm@example.com',
subject: 'Welcome!',
text: `Hey, ${name}! Thanks for joining Task Manager!`
}
transporter.sendMail(mailOptions)
}
module.exports = mailTo
我正在嘗試進行 Jest 測試,我需要模擬 nodemailer 和 mailGun 函數,所以每次運行測試時我都不會得到 email。 所以我創建了一個__mocks__
文件夾並將我的 2 個模擬模塊放在__mocks__/nodemailer.js
和__mocks__/nodemailer-mailgun-transport.js
中。 這是那些文件
//nodemailer.js
module.exports = {
createTransport() {
},
sendMail() {
}
}
//nodemailer-mailgun-transport.js
module.exports = {
mailGun() {
}
}
這是我的測試
const request = require('supertest')
const jwt = require('jsonwebtoken')
const mongoose = require('mongoose')
const app = require('../src/app')
const User = require('../src/models/user')
const userOneId = mongoose.Types.ObjectId()
const userOne = {
_id: userOneId,
name: 'Jon',
email: 'jon@example.com',
password: 'JonTest123',
tokens: [{
token: jwt.sign({ _id: userOneId }, process.env.JWT_SECRET)
}]
}
beforeEach(async () => {
await User.deleteMany()
await new User(userOne).save()
})
test('Should signup a new user', async() => {
const response = await request(app).post('/users').send({
name: 'Caleb',
email: 'caleb@example.com',
password: 'TestPass637!'
}).expect(201)
//Assert that the database was changed correctly
const user = await User.findById(response.body.user._id)
expect(user).not.toBeNull()
//Assertions about the response
expect(response.body).toMatchObject({
user: {
name: 'Caleb',
email: 'caleb@example.com'
},
token: user.tokens[0].token
})
expect(user.password).not.toBe('TestPass637!')
})
我有 Jest 設置來查找測試目錄中的__mocks__
文件,這是我擁有它的地方
但是當我運行測試時,我得到TypeError: mailGun is not a function
為什么它不能識別 mailGun() function?
nodemailer-mailgun-transport
應該返回 function 以便您可以將auth
傳遞給它。 在您的測試代碼中, mailGun
指的是默認的 output,而不是屬性。
//nodemailer-mailgun-transport.js
module.exports = (auth) => {
// do something with auth, if you want
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.