Тест защитника в 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
Напишите защитник, который пускает запрос только со служебным заголовком, и сравните положительный и отрицательный случай через тестовый модуль.