Node.js 不使用连接到数据库的服务进行Jest测试

Node.js 不使用连接到数据库的服务进行Jest测试,node.js,mongodb,testing,mongoose,jestjs,Node.js,Mongodb,Testing,Mongoose,Jestjs,我在测试与数据库有多个连接的nodejs应用程序时遇到问题 我想运行我的测试,而不创建任何与数据库的连接。但是,由于在我的模型中需要单独的连接,所以它似乎连接到了DB,即使它不是必需的 我使用jest和supertest进行测试 /MongoDB连接 const mongoose = require('mongoose'); const { MONGO_URI1, MONGO_URI2 } = require('../config'); const db1Connection = mongoo

我在测试与数据库有多个连接的nodejs应用程序时遇到问题

我想运行我的测试,而不创建任何与数据库的连接。但是,由于在我的模型中需要单独的连接,所以它似乎连接到了DB,即使它不是必需的

我使用jest和supertest进行测试

/MongoDB连接

const mongoose = require('mongoose');
const { MONGO_URI1, MONGO_URI2 } = require('../config');

const db1Connection = mongoose.createConnection(MONGO_URI1, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

const db2Connection = mongoose.createConnection(MONGO_URI2, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});;

module.exports = {
  db1Connection,
  db2Connection,
}; 
/学生模型

const { Schema, model } = require('mongoose');
const { db1Connection } = require('../mongodbConnection');

const studentSchema = new Schema(
  {
    studentId: { type: Number, required: true },
    email: { type: String, required: true },
    profileImage: { type: String, required: true },
  },
  {
    collection: 'students',
    timestamps: { updatedAt: 'lastModifiedTimeStamp' },
  }
);

module.exports = db1Connection.model('StudentSchema', studentSchema);
/服务

const Student = require('../models/student.model');
const getStudent = async (params) => {
  try {
    let student = await Student.findOne({ ...params })
      .exec();
    return student;
  } catch (error) {
    throw new Error('Cannot find student');
  }
};
test.js

const express = require('express');
const bodyParser = require('body-parser');
const request = require('supertest');

const { getStudentInfo } = require('../getStudent.controller');

const { getStudent } = require('../student.service');

// mock service
jest.mock('../student.service');

const app = express();
app.use(bodyParser.json());
app.use('/student', getStudentInfo);

describe('GET student controller', () => {

  const mockData = [
    {
      studentId: 'abc',
      email: 'test@test.com',
      profileImage: 'test.jpg',
    },
  ];

  getStudent.mockResolvedValue(mockData);

  describe('GET /student', () => {
    it('Responds with correct student', async (done) => {
      const response = await request(app).get('/student');

      expect(response.status).toBe(200);
      expect(response.body).toEqual({ student: mockData });
      return done();
    });
  });

});
因此,当我测试控制器并模拟服务时,错误显示需要连接到DB。然而,在我的控制器测试中,我并不要求这样做,因为我已经模拟了服务。那么有什么办法可以克服这个问题吗


如果我只使用mongoose.connect建立一个连接,测试就可以工作。但是,当我使用上述代码时,它会中断测试并要求提供环境变量。

您能在此处发布错误吗?错误只是说没有提供环境变量。但是,我不需要连接进行测试。您可以添加测试代码和要在服务中模拟的函数吗?否则,您可以模拟模型函数,并确保jest.config文件具有
testEnvironment:“node”
hmm如何模拟模型函数?使用测试代码更新spyOn做什么?默认情况下,spyOn还调用spied方法。这与大多数其他测试库的行为不同。如果要覆盖原始函数,可以使用jest.spyOn(object,methodName).mockImplementation(()=>customImplementation)
const Student = require('../models/student.model');
const mock = jest.spyOn(Student, 'findOne');
const mockData = [
 {
  studentId: 'abc',
  email: 'test@test.com',
  profileImage: 'test.jpg',
 },
];
mock.mockImplementation(() => {
   return {
     populate: ()=>{
       return {
         exec: () => Promise.resolve(mockData)
       }
     }
    }
 });