Node.js 不使用连接到数据库的服务进行Jest测试
我在测试与数据库有多个连接的nodejs应用程序时遇到问题 我想运行我的测试,而不创建任何与数据库的连接。但是,由于在我的模型中需要单独的连接,所以它似乎连接到了DB,即使它不是必需的 我使用jest和supertest进行测试 /MongoDB连接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
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)
}
}
}
});