РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpTeGd 138 of 201 menu
◀ ▶

Тест защитника в Nest

Доступ к странице иногда зависит от простого заголовка, а не от полноценной схемы входа. Если защитник ошибётся, клиент увидит лишние данные или лишний отказ, хотя остальной код не менялся.

Защитник реализует CanActivate и читает запрос из контекста. В тесте собирают модуль с провайдером, подставляют минимальный объект контекста с нужным заголовком и смотрят на булев результат без поднятия сервера.

Покажем на примере постов:

import { CanActivate, ExecutionContext, Injectable, } from '@nestjs/common'; @Injectable() export class SecretGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); return request.headers['x-secret'] === 'open'; } }

Проверка с заголовком, который должен пропустить запрос:

import { describe, it, expect } from 'vitest'; import { ExecutionContext } from '@nestjs/common'; import { Test } from '@nestjs/testing'; import { SecretGuard } from '../src/secret.guard.js'; describe('SecretGuard', () => { it('allows with matching header', async () => { const moduleRef = await Test.createTestingModule({ providers: [SecretGuard], }).compile(); const guard = moduleRef.get(SecretGuard); const context = { switchToHttp: () => ({ getRequest: () => ({ headers: { 'x-secret': 'open' }, }), }), } as ExecutionContext; expect(guard.canActivate(context)).toBe(true); }); });

Запуск:

npx vitest run test/secret.guard.spec.ts

Напишите защитник, который пускает запрос только со служебным заголовком, и сравните положительный и отрицательный случай через тестовый модуль.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить