You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
        })
    })

报错情况

  1. 首次测试报错:
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;(后续修改后该行代码已调整)

  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:36:23