Почему в проекте nestjs нет documents.controller.spec.ts

Вы правы, в структуре проекта отсутствует файл documents.controller.spec.ts, который обычно используется для написания unit-тестов контроллера. Это упущение, и я сейчас объясню, почему он важен, а также покажу, как его добавить.

Почему нужен documents.controller.spec.ts?

Файл documents.controller.spec.ts необходим для тестирования контроллера DocumentsController. Unit-тесты позволяют убедиться, что контроллер корректно обрабатывает запросы и взаимодействует с сервисом. Это особенно важно для поддержания качества кода и предотвращения ошибок при внесении изменений.

Как добавить documents.controller.spec.ts?

Вот пример файла documents.controller.spec.ts для тестирования контроллера DocumentsController:

typescript

import { Test, TestingModule } from '@nestjs/testing';
import { DocumentsController } from './documents.controller';
import { DocumentsService } from './documents.service';

describe('DocumentsController', () => {
  let controller: DocumentsController;
  let service: DocumentsService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [DocumentsController],
      providers: [
        {
          provide: DocumentsService,
          useValue: {
            findAll: jest.fn().mockResolvedValue([
              { id: 1, title: 'Test Document 1' },
              { id: 2, title: 'Test Document 2' },
            ]),
            findOne: jest.fn().mockResolvedValue({ id: 1, title: 'Test Document 1' }),
            create: jest.fn().mockResolvedValue({ id: 3, title: 'New Document' }),
          },
        },
      ],
    }).compile();

    controller = module.get<DocumentsController>(DocumentsController);
    service = module.get<DocumentsService>(DocumentsService);
  });

  it('should be defined', () => {
    expect(controller).toBeDefined();
  });

  describe('findAll', () => {
    it('should return an array of documents', async () => {
      const result = await controller.findAll();
      expect(result).toEqual([
        { id: 1, title: 'Test Document 1' },
        { id: 2, title: 'Test Document 2' },
      ]);
    });
  });

  describe('findOne', () => {
    it('should return a single document', async () => {
      const result = await controller.findOne(1);
      expect(result).toEqual({ id: 1, title: 'Test Document 1' });
    });
  });

  describe('create', () => {
    it('should create a new document', async () => {
      const dto = { documentNumber: 'DOC-3', documentDate: new Date(), title: 'New Document', filepath: '/path/to/file' };
      const result = await controller.create(dto);
      expect(result).toEqual({ id: 3, title: 'New Document' });
    });
  });
});

Объяснение:

  1. Модуль тестирования:
    • Используется TestingModule из NestJS для создания тестового окружения.
    • Сервис DocumentsService замокан с помощью jest.fn().
  2. Тесты:
    • findAll: Проверяет, что метод возвращает массив документов.
    • findOne: Проверяет, что метод возвращает один документ по ID.
    • create: Проверяет, что метод создает новый документ.
  3. Mock-сервис:
    • Вместо реального сервиса используется mock-объект, чтобы изолировать тестирование контроллера.

Добавление файла в структуру проекта:

После добавления файла структура проекта будет выглядеть так:

javascript

src/
├── documents/
│   ├── documents.controller.ts
│   ├── documents.controller.spec.ts  # Unit-тесты для контроллера
│   ├── documents.service.ts
│   ├── documents.module.ts
│   └── dto/
│       └── create-document.dto.ts

Теперь у вас есть тесты для контроллера DocumentsController, которые можно запускать с помощью команды:

bash

npm run test

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