我正试图通过我的代码库端到端测试实现全面覆盖,所以我也想测试
.catch()
代码。我正在尝试这样的事情:
文件 user.controller.js:
const getUser = async(req, res) => {
try {
const user = await User.findOne({name: req.name});
return res.status(200).json(user);
} catch (err) {
// THIS IS THE CODE I WANT TO TEST
console.error(`Error finding user ${req.name}:`, err);
return res.status(err.code).json({ message: err });
}
}
文件测试/user.test.js:
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() {
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();
})
;
});
});
});
问题是在我的测试中从未调用过假的
findOne()
方法,并且getUser
方法从不抛出,使我的测试失败...
可能我遗漏了一些明显的东西,但我真的找不到它...... :-(
如果需要更多代码或上下文,请索取...