簡體   English   中英

當 Mocking 帶有 Jest 的節點模塊時出現 TypeError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM