#node.js #express #routes #jestjs #supertest
Вопрос:
Я пытаюсь написать тесты для простой защищенной конечной точки. У меня есть auth()
промежуточное программное обеспечение, которое проверяет Authorization
заголовок и после успешной проверки добавляет ключ token
к req
объекту.
Проблема в том, что jest
он напрямую вызывает getCustomerProfile
контроллер и пропускает выполнение auth()
промежуточного программного обеспечения, из-за которого, по словам контроллера req.token
, не определено. Вот как выглядит моя установка для шуток:
const express = require('express');
const mapRoutes = require('express-routes-mapper');
const privateRoutes = ('../routes/private_routes')
const auth = require('auth_middleware');
const setupAction = async () => {
const testapp = express();
const mappedPrivateRoutes = mapRoutes(privateRoutes, 'api/controllers/');
testapp.use(express.urlencoded({ extended: false }));
testapp.use(express.json());
testapp.use('/private', mappedPrivateRoutes);
testapp.all('/private/*', (req, res, next) => auth(req, res, next));
return testapp;
};
module.exports = { setupAction };
Ниже показано, как я пытаюсь протестировать защищенную конечную точку:
const request = require('supertest');
const {
setupAction
} = require('./setup_jest');
const Customer = require('models/customer_model');
let test_api;
beforeAll(async () => {
test_api = await setupAction();
});
....
...
...
test('Customer | get profile', async () => {
let token = 'TestToken123'
res = await request(api)
.get('/private/customer/get-profile')
.set('Accept', /json/)
.set('Authorization', `Bearer ${token}`)
.send()
.expect(200);
expect(res.body.customer_id).toBeTruthy();
});
В auth.js
я попытался добавить console.log()
утверждения, но это не возымело никакого эффекта. Ничего не печатается, и запрос отправляется прямо в getCustomerProfile()
контроллер без проверки заголовков авторизации.
Что еще интереснее, так это то, что когда express
приложение запущено и я нажимаю на частную конечную точку с Authorization
помощью заголовка Postman
, он работает совершенно нормально, и запрос проходит через auth()
промежуточное программное обеспечение.
Только во время выполнения jest промежуточное программное обеспечение пропускается!
Я застрял здесь уже на несколько часов. Кто-нибудь может, пожалуйста, помочь мне с этим? Заранее благодарю вас 🙂
Комментарии:
1. Ваш
testapp.all('/private/*', (req, res, next) => auth(req, res, next));
должен быть простоtestapp.use('/private/*', auth)
потому, что он предназначен для промежуточного программного обеспечения, и его следует размещать после » testapp.use(express.json ());». Я так не думаю. все они должны использоваться для промежуточных программ.2. @dev Я также пробовал использовать testapp.use(), это тоже не сработало