Sinon存根在测试文件之外被忽略

问题描述 投票:2回答:1

我正在使用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

从这里,我们可以看到,在存根被注册之后,我可以在测试文件中调用它并且它被正确地存根。但是当在route.post()中调用passport.authenticate()时,它是实际的passport.authenticate()并发送状态为401的响应,因为我没有通过身份验证。

对于发生了什么的任何想法?

node.js express mocha passport.js sinon
1个回答
0
投票

您的代码在运行后立即调用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();
        });
    });
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.