Отключение промежуточного программного обеспечения

#node.js #sinon #chai #chai-http

#node.js #sinon #чай #chai-http

Вопрос:

Я пытаюсь использовать Sinon для отключения некоторого пользовательского промежуточного программного обеспечения в экспресс-маршруте, но это работает не так, как я ожидаю. Я ожидаю, что он не будет регистрировать «Я выполняю аутентификацию …», а вместо этого зарегистрирует «Заглушенный» на консоли. Похоже, что sinon неправильно удаляет промежуточное программное обеспечение.

test/test.js

 const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
chai.use(chaiHttp);
const should = chai.should();
const auth = require('../auth');

const app = require('../app')

describe('My routes', function() {
    let checkTokenStub;
    beforeEach(()=>{
        checkTokenStub = sinon.stub(auth,'checkToken').callsFake(()=>{
            console.log('Stubbed');
        });;
    })
     it('returns hello', function(done) {
            chai.request(app)
                .get('/')
                .set('X-Auth-Token', 'xyz123')
                .end((err,res)=>{
                    res.text.should.be.eql('Hello')

                    done(err)
                })
        });
    });
  

app.js

 var express = require('express'),
    app = express();
var router = express.Router();
app.use('/', require('./router'));

module.exports = app;
  

auth.js

 exports.checkToken = function(req, res, next) {

    console.log('I am authenticating...')

    var authToken = req.get('x-auth-token');

    if (!authToken)
        return res.sendStatus(401);

    next();
}
  

router.js

 var express = require('express'),
router = express.Router();
auth = require('./auth');

router.get('/', auth.checkToken, function(req, res, next) {
    return res.send('Hello');
});

module.exports = router;
  

package.json

 {
  "name": "sinontest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha --watch"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "chai": "^4.1.2",
    "chai-http": "^3.0.0",
    "mocha": "^4.0.1",
    "sinon": "^4.1.1"
  },
  "dependencies": {
    "express": "^4.16.4"
  }
}
  

Комментарии:

1. попробуйте запросить ваше приложение после того, как вы отключили свой метод. Я думаю, проблема в том, что ваши маршруты настроены со ссылкой на промежуточное программное обеспечение после того, как вам потребуется ваше app.js , а затем вы заглушаете свой метод, но маршрут уже настроен с исходной ссылкой на функцию

2. Да. @Gonzalo.- вот и все. Спасибо, я застрял на этом в течение нескольких дней.

Ответ №1:

@Gonzalo.- ответил на этот вопрос в комментариях. Мне пришлось переместить требование приложения после заглушки.

test.js

 const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
chai.use(chaiHttp);
const should = chai.should();
const auth = require('../auth');
let app;


describe('My routes', function() {
    let checkTokenStub;
    before(()=>{
        checkTokenStub = sinon.stub(auth,'checkToken').callsFake((req,res,next)=>{
            console.log('Stubbed');
            next()
        });

        app = require('../app')

    })
     it('returns hello', function(done) {
            chai.request(app)
                .get('/')
                .set('X-Auth-Token', 'xyz123')
                .end((err,res)=>{
                    res.text.should.be.eql('Hello')

                    done(err)
                })
        });
    });
  

Комментарии:

1. Потрясающе! callsFake — это то, что я искал 🙂