Я использую mocha, chai и sinon для проверки некоторых аутентифицированных маршрутов API. Я использую passport.authenticate () в качестве промежуточного программного обеспечения для аутентификации маршрута:
const router = require('express').Router();
const passport = require('passport');
router.post('/route',
passport.authenticate('jwt', {session:false}),
function(req,res) {
return res.status(200);
});
module.exports = router;
Затем в своем тестовом наборе я использую sinon для отключения passport.authenticate вызовов:
const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
const passport = require('passport');
const server = require('../../app');
const expect = chai.expect;
chai.use(chaiHttp);
describe('route', function() {
before(function(done) {
sinon.stub(passport, 'authenticate').callsFake(function(test, args) {
console.log('Auth stub');
});
console.log('stub registered');
passport.authenticate('jwt', {session:false});
done();
});
after(function(done) {
console.log('after hook');
passport.authenticate.restore();
done();
});
describe('POST /route', function() {
it('should post', function(done) {
console.log('starting test');
chai.request(server)
.post('/route')
.end(function(err,res) {
expect(res).to.have.status(200);
done();
});
});
});
});
Теперь, когда я запускаю набор тестов, я вижу, что он распечатывает следующее:
route
stub registered
Auth stub
POST /route
starting test
1) should post
after hook
1 failing
1) route
POST /route
should post:
Uncaught AssertionError: expected { Object (_events, _eventsCount, ...) } to have status code 200 but got 401
Из этого видно, что после регистрации заглушки я могу вызвать ее в тестовом файле, и она правильно заглушена. Но когда passport.authenticate () вызывается в route.post (), это фактический passport.authenticate () и отправляет ответ со статусом 401, потому что я не аутентифицирован.
Есть мысли о том, что происходит?