#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 — это то, что я искал 🙂