Полагаю, вы хотите написать несколько интеграционных тестов для него. Я использую Link Seams , чтобы заглушить функцию высокого порядка getUserAuthenticated
и супертест в качестве библиотеки интеграционных тестов.
Например,
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