Шутка не выполнять промежуточное программное обеспечение express

#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(), это тоже не сработало