使用Jest在Express Route中提供给请求的模拟中间件

时间:2019-05-21 01:54:19

标签: node.js express mongoose jestjs

我有以下Express路线:

app.route(`api/project`).post((req, res) => createProject(req, res))

在先前的代码中,我创建了将Mongoose附加到req对象的中间件,因此可以在req.mongoose内使用createProject来调用它。

问题是在单元测试中使用时,我不知道如何模拟req.mongoose

我尝试创建createProject(如下)的手动模拟,该模拟调用了真实的createProject,并将req.mongoose设置为存根,但这导致了StackOverflow错误。

// __mocks__/createProject.js

const { MongoMemoryServer } = require('mongodb-memory-server')
const realCreateProject = require('../createProject')
const mongoose = require('mongoose')

const createProject = async (req, res) => {
  const mongoServer = new MongoMemoryServer()
  const mongoUri = await mongoServer.getConnectionString()

  const options = { useNewUrlParser: true }

  await mongoose.connect(mongoUri, options, err => {
    if (err) console.error(`ERROR: beforeAll - ${err}`)
  })

  req.mongoose = mongoose

  realCreateProject(req, res)
}

那么,如何在路径中传递req对象之前将其模拟出来?

1 个答案:

答案 0 :(得分:0)

我犯的错误是在__mocks__/createProject.js中,我需要使用jest.requireActual()来导入真实的createProject.js文件,就像这样:

const realGetProjectDetails = jest.requireActual('../getProjectDetails')

这消除了循环依赖问题,并且测试按预期进行。

当一小段代码使您追逐尾巴好几个小时时,一定会喜欢它。...:\