#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');
выполняется endconsole.log('B')
. это неправильно? @Baboo_5. Что
request
делает, так это вызывает ваш API, как это сделал бы пользователь. Итак, Nestjs обрабатывает запрос следующим образом:middlewares before route -> route -> middlewares after route
. В вашем случае перехватчик — это промежуточное программное обеспечение, выполняемое после маршрута из-за этой строки кода:next.handle().pipe
. Сначала вы вызываетеnext
, а затем добавляете его.