NestModule: Тест Отчета Об Инфраструктуре NestJS App
Обзор
Тесты проверяют модульную архитектуру nestjs-mod: сборку модулей через createNestModule, DI-связи и feature-конфигурацию.
Что мы тестируем
- Режим инфраструктуры: Убеждаемся, что приложение может работать в режиме генерации документации инфраструктуры
- Генерация отчета: Проверяем, что полный отчет в формате markdown генерируется со всеми деталями модулей
- Документация конфигурации: Тестируем, что все статические конфигурации и окружения документированы
- Метаданные модулей: Подтверждаем, что описания модулей, общие провайдеры и настройки включены
- Форматирование таблиц: Проверяем правильную генерацию таблиц markdown для опций конфигурации
Ссылка на GitHub
- Файл: utils.spec.ts
- Строки: 437-572
Подготовительный код
Этот тест настраивает инфраструктурные модули для генерации отчета:
import { Injectable } from '@nestjs/common';
import { InfrastructureMarkdownReportGenerator,
InfrastructureMarkdownReportStorage,
InfrastructureMarkdownReportStorageService } from '../modules/infrastructure/infrastructure-markdown-report/infrastructure-markdown-report';
import { DefaultNestApplicationInitializer } from '../modules/system/default-nest-application/default-nest-application-initializer';
import { DefaultNestApplicationListener } from '../modules/system/default-nest-application/default-nest-application-listener';
import { createNestModule } from '../nest-module/utils';
import { bootstrapNestApplication } from './utils';
@Injectable()
class AppReportService {
constructor(private readonly infrastructureMarkdownReportStorage: InfrastructureMarkdownReportStorageService) {}
getReport() {
return this.infrastructureMarkdownReportStorage.report;
}
}
const { App1Module } = createNestModule({
moduleName: 'App1Module',
imports: [InfrastructureMarkdownReportStorage.forFeature()],
providers: [AppReportService],
});
Код теста
it('should return markdown of infrastructure', async () => {
process.env['NESTJS_MODE'] = 'infrastructure';
const app = await bootstrapNestApplication({
project: { name: 'TestApp', description: 'Test application' },
modules: {
infrastructure: [
InfrastructureMarkdownReportStorage.forRoot(),
InfrastructureMarkdownReportGenerator.forRoot(),
],
system: [
DefaultNestApplicationInitializer.forRoot(),
DefaultNestApplicationListener.forRoot({
staticEnvironments: { port: 3012 },
}),
],
feature: [App1Module.forRoot()],
},
});
const appReportService = app.get(AppReportService);
expect(appReportService.getReport().split(' ').join('').split('\n').join('')).toEqual(
`# TestApp
Test application
## System modules
...
### DefaultNestApplicationInitializer
...
#### Static configuration
| Key| Description | Constraints | Default | Value |
...
## Integration modules
...
### DefaultNestApplicationListener
...
#### Static environments
| Key| Description | Sources | Constraints | Default | Value |
...
| port |The port...|obj['port'], process.env['TEST_APP_PORT']|optional|3000|3012|
...
## Infrastructure modules
...
`.split(' ').join('').split('\n').join('')
);
await app.close();
process.env['NESTJS_MODE'] = undefined;
});
Что делает этот тест
- Устанавливает режим инфраструктуры через
process.env['NESTJS_MODE'] = 'infrastructure' - Настраивает инфраструктурные модули для хранения и генерации отчета
- Настраивает системные модули с пользовательской конфигурацией порта (3012)
- Загружает приложение в режиме инфраструктуры
- Получает сгенерированный отчет из InfrastructureMarkdownReportStorageService
- Нормализует пробелы и сравнивает с ожидаемой структурой markdown
- Проверяет, что отчет содержит:
- Имя и описание проекта
- Системные моду ли с их статическими конфигурациями
- Интеграционные модули с окружениями и конфигурациями
- Инфраструктурные модули с общими провайдерами
- Детальные таблицы, показывающие ключи, описания, источники, ограничения, значения по умолчанию и фактические значения
- Очищает закрывая приложение и сбрасывая режим
Ключевые моменты
- Этот тест фиксирует контракт поведения конкретного блока nestjs-mod в условиях данного сценария.
- Проверки в тесте защищают интеграционные границы и предотвращают регрессии при изменении внутренней реализации.