我正在努力通过我的代码库的端到端测试来实现良好的覆盖率,所以我也想测试 .catch() 代码。
我的API使用node.js和mongoose。
我使用chai和mocha进行测试。
我尝试了类似以下的代码:
文件 src/controllers/user.controller.js:
const User = require("../models/user.model"); const getUser = async(req, res) => { try { const user = await User.findOne({name: req.name}); return res.status(200).json(user); } catch (err) { // 这是我想要测试的代码 console.error(`查找用户 ${req.name} 时出错:`, err); return res.status(err.code).json({ message: err }); } } 文件 src/models/user.model.js:
const mongoose = require("mongoose"); const UserSchema = mongoose.Schema({ name: { type: String, required: "Name is required", }, }); module.exports = mongoose.model("User", UserSchema); 文件 test/user.test.js:
const chai = require("chai"); const chaiHttp = require("chai-http"); const spies = require("chai-spies"); const User = require("../src/models/user.model"); chai.use(chaiHttp); chai.use(spies); chai.should(); describe("应处理mongoose错误", function() { describe("有问题的User.findOne方法", function() { const _User_findOne_Backup = User.findOne; beforeEach(function() { // 这个函数应该重载真正的findOne函数,但它没有成功!User.findOne = function() { return Promise.reject("强制错误"); }; }); afterEach(function() { // 每个测试后恢复真正的函数 User.findOne = _User_findOne_Backup; }); it("注册应该返回服务器错误", function() { const spy = chai.spy(); return chai .request(server) .post("/api/getUser") .send({name: "Alice"}) .then(spy) .catch((err) => { const res = err.response; res.should.have.status(500); }) .then(() => { spy.should.not.have.been.called(); }) ; }); }); }); 问题是在我的测试中,伪造的 User.findOne() 方法从未被调用:原始的mongoose findOne 方法被调用成功,所以 getUser 方法从不抛出异常,导致我的测试失败...
可能我漏掉了一些明显的东西,但我真的找不到它... :-(
如果需要更多的代码或上下文,请告诉我...
更新: 根据 @Bergi 的建议,我添加了关于我的(简化的)模型和所需模块的完整信息...
对我来说很好用。
例如:
user.model.js:const mongoose = require("mongoose"); const UserSchema = mongoose.Schema({ name: { type: String, required: "Name is required", }, }); module.exports = mongoose.model("User", UserSchema);user.controller.js:const User = require("./user.model"); const getUser = async (req, res) => { try { const user = await User.findOne({ name: req.body.name }); return res.status(200).json(user); } catch (err) { console.error(`Error finding user ${req.body.name}:`, err); return res.status(500).json({ message: err }); } } module.exports = { getUser }server.js:const express = require('express'); const userController = require('./user.controller'); const app = express(); app.use(express.json()) app.post('/api/getUser', userController.getUser) module.exports = app;user.test.js:const chai = require("chai"); const chaiHttp = require("chai-http"); const User = require("./user.model"); const server = require('./server'); chai.use(chaiHttp); chai.should(); describe("should handle mongoose errors", function () { describe("faulty User.findOne method", function () { const _User_findOne_Backup = User.findOne; beforeEach(function () { User.findOne = function () { return Promise.reject("forced error"); }; }); afterEach(function () { User.findOne = _User_findOne_Backup; }); it("signup should respond with a server error", function () { return chai .request(server) .post("/api/getUser") .send({ name: "Alice" }) .catch((err) => { const res = err.response; res.should.have.status(500); }) ; }); }); });测试结果:
软件包版本: