调用homepageHandler时报错TypeError:Cannot read properties of undefined
问题:测试Jest时出现
TypeError: Cannot read properties of undefined (reading 'homepageHandler') 控制器代码 (controllers/index.js)
var indexExports = module.exports = { homepageHandler: function (req, res) { console.log(`index page. Req ${req}`); return res.status(200).json({ "message": "welcome" }); } }
测试代码
const dotenv = require('dotenv'); const request = require("supertest") var indexControllerModule = require('../controllers/index'); beforeAll(async () => { dotenv.config(); console.log(`Ensure both Mongo and Express is running before running these tests`); }); describe("Endpoints are accessible", () => { it("GET request for homepage should return 200", async () => { const baseURL = process.env.EXPRESS_SERVER_TEST console.log(`base url is ${baseURL}`); const req = {}; const res = { status: jest.fn(), json: jest.fn(), } indexControllerModule.indexExports.homepageHandler(req,res) .then((result)=>{ console.log(`result is ${result}`); expect(1).toBe(1); }) .catch((error)=>{ console.log(`error in accessing homepage: ${error}`); }) }); });
报错信息
TypeError: Cannot read properties of undefined (reading 'homepageHandler') 18 | json: jest.fn(), 19 | } > 20 | indexControllerModule.indexExports.homepageHandler(req,res) | ^ 21 | .then((result)=>{ 22 | console.log(`result is ${result}`); 23 | expect(1).toBe(1);
问题原因与修复方案
核心问题
你在控制器中直接把包含homepageHandler的对象赋值给了module.exports,同时用indexExports变量引用了这个对象。但导入模块后,indexControllerModule本身就是你导出的那个对象,它并没有indexExports这个属性,所以会触发读取未定义属性的错误。
修复方式(二选一)
方式1:修改测试代码的调用逻辑
直接通过导入的模块访问homepageHandler即可:
// 替换测试中的调用行 indexControllerModule.homepageHandler(req, res)
方式2:修改控制器的导出结构(可选)
如果需要保留indexExports变量,可以把导出改成嵌套结构:
var indexExports = { homepageHandler: function (req, res) { console.log(`index page. Req ${req}`); return res.status(200).json({ "message": "welcome" }); } }; module.exports = { indexExports };
这种情况下测试代码无需修改,但更推荐方式1,符合Node.js模块导出的常规写法,避免多余嵌套。
额外优化建议
你的homepageHandler没有返回Promise,测试中使用.then()没有实际意义。可以直接调用后断言响应方法是否被正确调用,让测试更有价值:
indexControllerModule.homepageHandler(req, res); expect(res.status).toHaveBeenCalledWith(200); expect(res.json).toHaveBeenCalledWith({ message: "welcome" });
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

