Заглушка Sinon игнорируется вне тестового файла - PullRequest
2 голосов
/ 08 марта 2019

Я использую 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, потому что я не аутентифицирован.

Есть мысли о том, что происходит?

1 Ответ

0 голосов
/ 08 марта 2019

Ваш код вызывает passport.authenticate , как только он запускает , и он запускает , как только это требуется .

Поскольку вам требуется код наВ начале теста до того, как stub был создан, ваш код заканчивает тем, что вызывает реальный passport.authenticate.

Для того, чтобы подобный код вызывал stub, вы должны настроить stub прежде чем вам потребуется код :

const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
const passport = require('passport');
// const server = require('../../app');  <= don't require your code here...
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');
      const server = require('../../app');  // <= require it AFTER creating the stub
      chai.request(server)
        .post('/route')
        .end(function (err, res) {
          expect(res).to.have.status(200);
          done();
        });
    });
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...