导出带参函数遇ReferenceError,Node.js+Express+Jest测试问题
解决Jest测试Express后端时的ReferenceError:u is not defined
咱们先直接揪出问题的根源:你在导出checkCredentials函数的时候犯了一个小错误——你直接调用了函数,而不是导出函数本身。
看你写的这行代码:
exports.checkCredentials = checkCredentials(u,p);
这里u和p在当前上下文里根本没有定义,Node.js执行到这一行的时候,会尝试去调用checkCredentials(u,p),但找不到u和p,自然就抛出了ReferenceError: u is not defined。
第一步:修正导出代码
你需要导出的是函数的引用,而不是函数执行后的结果。把上面那行改成:
exports.checkCredentials = checkCredentials; module.exports = app;
这样导出后,在测试文件里你就能自己传入参数调用这个函数了。
第二步:修正测试代码的问题
你的测试代码还有几个需要调整的地方,才能正常工作:
1. 确保发送POST请求的Body数据
后端的req.body.username和req.body.password需要你在测试里通过请求发送,不然req.body会是空的,验证肯定失败。
2. 调整异步测试的结构
Jest处理异步测试需要正确使用done回调,或者返回Promise。结合supertest(假设你用的是这个库来测试接口),可以更简洁地写测试。
修正后的测试文件示例:
const request = require('supertest'); const app = require('../path/to/your/app-file'); // 替换成你的实际文件路径 describe('Login', () => { // 先单独测试checkCredentials工具函数 test('checkCredentials returns true for valid credentials', () => { expect(app.checkCredentials('user', 'password')).toBe(true); }); // 测试合法凭证的POST请求 test('POST /home returns 200 with valid credentials', (done) => { request(app) .post('/home') .send({ username: 'user', password: 'password' }) // 发送请求体 .expect(200) .end((err) => { if (err) return done(err); done(); }); }); // 测试非法凭证的POST请求 test('POST /home redirects to /login with invalid credentials', (done) => { request(app) .post('/home') .send({ username: 'wrong-user', password: 'wrong-pass' }) .expect(302) // 重定向的状态码是302 .expect('Location', '/login') .end((err) => { if (err) return done(err); done(); }); }); });
额外说明
- 把工具函数(比如
checkCredentials)和接口测试分开,能让你的测试更清晰,也更容易定位问题。 - 如果你还没安装supertest,需要先执行
npm install supertest --save-dev。
内容的提问来源于stack exchange,提问作者Hotai
相关产品推荐
相关产品推荐

