Node.js Mocha测试报错:getUser方法无法读取req属性求助
Node.js Mocha测试中getUser接口的报错解决
问题概述
在Node.js的Mocha测试场景下,测试getUser接口时持续触发TypeError,Postman调用接口功能正常,但测试用例始终失败。
现有代码
getUser接口代码
getUser: function(req, res) { var roomId = req.params.id; console.log(roomId); User.findById(roomId).exec((err, room) => { // Room.find({ availability: true }).exec((err, room) => { if (err || !room) { return res.status(404).send({ status: 'error', message: 'No existe la habitacion' }); } return res.status(200).send({ status: 'success', room }); });
Mocha测试框架代码
describe('users', ()=>{ let findStub; let deleteStub; let sampleUser; let mailerStub; beforeEach(()=>{ sampleUser = { id: 123, name: 'foo', email: 'foo@bar.com', save: sandbox.stub().resolves() } findStub = sandbox.stub(mongoose.Model, 'findById').resolves(sampleUser); deleteStub = sandbox.stub(mongoose.Model, 'remove').resolves('fake_remove_result'); }) afterEach(()=>{ sandbox.restore(); users = rewire('./user'); })
测试用例代码
context('get', ()=>{ it('should check for an id', (done)=>{ users.getUser(null, (err, result)=>{ expect(err).to.exist; expect(err.message).to.equal('Invalid user id'); done(); }) })
报错情况
- 首次测试报错:
users get should check for an id: TypeError: Cannot read properties of null (reading 'body') at Object.getUser (controllers/user.js:113:22)
错误触发于代码行var params= req.body;(后续修改后该行代码已调整)
- 修改getUser方法后(Postman调用正常),测试仍报错:
TypeError: Cannot read properties of undefined (reading 'id')
解决步骤
1. 修复测试用例的参数传递
测试用例中传入null作为req对象,导致代码读取req.params.id时触发TypeError。需构造模拟的req、res对象,保证属性存在:
it('should check for an id', (done)=>{ // 构造空参数的req对象 const mockReq = { params: {} }; // 模拟res对象,实现链式调用的status和send方法 const mockRes = { status: sandbox.stub().returnsThis(), send: sandbox.stub().callsFake((response) => { expect(response.status).to.equal('error'); expect(response.message).to.equal('Invalid user id'); done(); }) }; users.getUser(mockReq, mockRes); })
2. 完善getUser方法的参数校验
在访问req.params.id前,先校验req及req.params的合法性,避免运行时错误:
getUser: function(req, res) { // 校验请求对象完整性 if (!req || !req.params) { return res.status(400).send({ status: 'error', message: 'Invalid request' }); } const roomId = req.params.id; // 校验ID是否存在 if (!roomId) { return res.status(400).send({ status: 'error', message: 'Invalid user id' }); } console.log(roomId); User.findById(roomId).exec((err, room) => { if (err || !room) { return res.status(404).send({ status: 'error', message: 'No existe la habitacion' }); } return res.status(200).send({ status: 'success', room }); }); }
3. 调整Stub的目标对象
当前Stub的是mongoose.Model.findById,但实际代码调用的是User.findById,需直接StubUser的findById方法以确保生效:
// 替换beforeEach中的findStub定义 findStub = sandbox.stub(User, 'findById').resolves(sampleUser);
内容的提问来源于stack exchange,提问作者Rafael Hernández
相关产品推荐
相关产品推荐

