该功能检查路由是否可访问
function isSessionCookieValid(req, res, next) {
if (!isValid(req.session)) {
return res.status(401).json({
isLoggedIn: false
});
}
return next();
}
在另一个文件中,我使用上述功能发出了一个后继请求,这是一条受保护的路线
app
.route('/url')
.post(utils.isSessionCookieValid, (req, res, next) => {})
测试部分
问题是我不知道如何模拟 isSessionCookieValid ,因为它需要下一个,但无法通过我的测试中的下一个回调:
describe('testing routes', () => {
it('should enter the route body', (done) => {
utils.isSessionCookieValid(req, res, 'next should be here...');
chai.request(server)
.post('/url')
.end(function (error, response, body) {
if (error) {
done(error);
} else {
done();
}
});
});
});
错误:TypeError:下一个不是函数
答案 0 :(得分:1)
我将使用sinonjs作为模拟库。模拟isSessionCookieValid
中间件的实现,让它始终转到下一个中间件。
例如
server.ts
:
import express from 'express';
import * as utils from './utils';
const app = express();
const port = 3000;
app.route('/url').post(utils.isSessionCookieValid, (req, res, next) => {
res.sendStatus(200);
});
if (require.main === module) {
app.listen(port, () => {
console.log(`Server is listening on port ${port}`);
});
}
export { app };
utils.ts
:
function isSessionCookieValid(req, res, next) {
if (!isValid(req.session)) {
return res.status(401).json({
isLoggedIn: false,
});
}
return next();
}
function isValid(session) {
return true;
}
export { isSessionCookieValid };
server.test.ts
:
import * as utils from './utils';
import sinon from 'sinon';
import chai, { expect } from 'chai';
import chaiHttp from 'chai-http';
chai.use(chaiHttp);
describe('testing routes', () => {
it('should enter the route body', (done) => {
const isSessionCookieValidStub = sinon.stub(utils, 'isSessionCookieValid').callsFake((req, res, next) => {
next();
});
const { app } = require('./server');
chai
.request(app)
.post('/url')
.end((error, response) => {
if (error) {
return done(error);
}
sinon.assert.calledOnce(isSessionCookieValidStub);
expect(response).to.have.status(200);
done();
});
});
});
单元测试结果:
testing routes
✓ should enter the route body (500ms)
1 passing (510ms)
-----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-----------|---------|----------|---------|---------|-------------------
All files | 60 | 25 | 25 | 60 |
server.ts | 80 | 50 | 50 | 80 | 12-13
utils.ts | 20 | 0 | 0 | 20 | 2-11
-----------|---------|----------|---------|---------|-------------------
源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/54462600