我在这样的参数化函数中有一个中间件
export const getUserAuthenticated = (var1, var2, var3) => {
return async (req, res, next) => {
try {
//some logic
next();
} catch (err) {
next(err);
}
};
};
并且正在这样拨打电话
Router.get('/', getUserAuthenticated(var1val,var2val,vrl3val),getUsers);
我想跳过sinon中的getUserAutheticated中间件
我想您要为此编写一些集成测试。我使用Link Seams存根getUserAuthenticated
高阶函数并将supertest作为集成测试库。
例如
server.ts
:
import express from 'express';
import { getUserAuthenticated } from './middlewares';
const app = express();
const port = 3000;
function getUsers(req, res) {
const users = [{ name: 'james' }, { name: 'jane' }];
res.json(users);
}
app.get('/', getUserAuthenticated('var1val', 'var2val', 'vrl3val'), getUsers);
app.use((err, req, res, next) => {
res.status(500).send('Internal server error');
});
if (require.main === module) {
app.listen(port, () => {
console.log(`HTTP server is listening on http://localhost:${port}`);
});
}
export { app };
middlewares.ts
:
export const getUserAuthenticated = (var1, var2, var3) => {
return async (req, res, next) => {
try {
// some logic
if (!req.get('token')) {
throw new Error('token required');
}
next();
} catch (err) {
next(err);
}
};
};
server.test.ts
:
import request from 'supertest';
import sinon from 'sinon';
import proxyquire from 'proxyquire';
describe('61143580', () => {
it('should throw error', (done) => {
const { app } = require('./server');
request(app)
.get('/')
.expect(500)
.end((err, res) => {
if (err) return done(err);
console.log(res.text);
sinon.assert.match(res.text, 'Internal server error');
done();
});
});
it('should get users', (done) => {
const middlewaresStub = {
getUserAuthenticated: sinon.stub().callsFake((var1, var2, var3) => {
return async (req, res, next) => {
next();
};
}),
};
const { app } = proxyquire('./server', {
'./middlewares': middlewaresStub,
});
request(app)
.get('/')
.expect(200)
.end((err, res) => {
if (err) return done(err);
console.log(res.body);
sinon.assert.match(res.body, [{ name: 'james' }, { name: 'jane' }]);
sinon.assert.calledWithExactly(middlewaresStub.getUserAuthenticated, 'var1val', 'var2val', 'vrl3val');
done();
});
});
});
我没有在第一个测试用例中存根getUserAuthenticated
函数,它将在中间件中引发错误。
具有覆盖率报告的集成测试结果:
61143580
Internal server error
✓ should throw error (471ms)
[ { name: 'james' }, { name: 'jane' } ]
✓ should get users (63ms)
2 passing (556ms)
----------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------------|---------|----------|---------|---------|-------------------
All files | 85.71 | 50 | 83.33 | 85 |
middlewares.ts | 87.5 | 50 | 100 | 85.71 | 8
server.ts | 84.62 | 50 | 66.67 | 84.62 | 19,20
----------------|---------|----------|---------|---------|-------------------
源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/61143580