Запрос Nestjs, перехватчик в тестировании

#testing #request #nestjs

#тестирование #запрос #nestjs

Вопрос:

У меня есть RateUpInterceptor, и это добавляет скорость подсчета 1

 @Injectable()
export class RateUpInterceptor implements NestInterceptor {
  constructor() {}

  intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {
    const http = context.switchToHttp();
    const req = http.getRequest<IRequestAugmented>();
    const res = http.getResponse<Response>();
    return next.handle().pipe(
      tap(async () => {
        /** COUNT PLUS 1 **/
        console.log('A');
      }),
      catchError((e) => {
        return throwError(e);
      }),
    );
  }
}

  
 describe('RateUpInterceptor', () => {
  let app: INestApplication;
  let module: TestingModule;

  beforeAll(async () => {
    module = await Test.createTestingModule({
      imports: [UserModule],
      providers: [
        {
          provide: APP_INTERCEPTOR,
          useFactory: () => {
            return new RateUpInterceptor();
          },
        },
      ],
    }).compile();

    app = module.createNestApplication();
    await app.init();

  });
  
  it('test', async () => {
    request(app.getHttpServer())
      .get(`valid url`)
      .auth(token, { type: 'bearer' })
      .expect(200).end(async () => {
        console.log('B');      
      });
  });  
});

  

Я протестировал этот перехватчик с помощью теста e2e с использованием запроса.

Я думал, что после глобального перехватчика «console.log (‘B’)» выполняется

но результат был другим… результат, ожидающий этого

 B
A
  

Как я могу исправить этот порядок?

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

1. Почему вы хотите инвертировать порядок? Перехватчик должен выполняться до выполнения маршрута, а не после?

2. @Baboo_ Количество RateUpInterceptor плюс 1, и я хочу результат после RateUpInterceptor, чтобы проверить скорость. но в .end() количество не превышает 1…

3. Это нормально, потому что на данный момент перехватчик выполняется только console.log('A'); , если приведенный здесь код не совпадает с кодом в вашем файле

4. это пример. я думаю, что после выполнения перехватчика console.log('A'); выполняется end console.log('B') . это неправильно? @Baboo_

5. Что request делает, так это вызывает ваш API, как это сделал бы пользователь. Итак, Nestjs обрабатывает запрос следующим образом: middlewares before route -> route -> middlewares after route . В вашем случае перехватчик — это промежуточное программное обеспечение, выполняемое после маршрута из-за этой строки кода: next.handle().pipe . Сначала вы вызываете next , а затем добавляете его.