Является ли мой модульный тест для Nest.js проект правильный?

#javascript #typescript #unit-testing #jestjs #nestjs

Вопрос:

Я написал модульный тест для своего Nest.js проект. Я просто хочу подтвердить, что этот тест правильный?

Я тестирую файл службы nest. Ниже приведен код:

задачи.сервис.ts

 async getTaskById(id: string): Promise<Task> {
    const found = await this.taskModel.findById(id);

    if (!found) {
      throw new NotFoundException(`Task not found`);
    }

    return found;
 }
 

задачи.сервис.технические характеристики

 const mockTask = () => {
  return {
    _id: '613e4135ea46be481c2d88b2',
    name: 'Task 1',
    description: 'Go to school',
  };
};

const tasksServiceMock: Partial<TasksService> = {
  getTaskById: jest.fn().mockResolvedValue(mockTask()),
};

describe('TasksService', () => {
  let service: TasksService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        TasksService,
        {
          provide: TasksService,
          useValue: tasksServiceMock,
        },
      ],
    }).compile();

    service = module.get<TasksService>(TasksService);
  });

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

  describe('getTaskById', () => {
    it('should get task by ID', async () => {
      const task = await service.getTaskById(mockTask()._id);
      expect(task).toEqual(mockTask());
    });

    it('should throw task Not found error', async () => {
      tasksServiceMock.getTaskById = jest
        .fn()
        .mockRejectedValue(new NotFoundException('Task not found'));

      expect.assertions(2);

      try {
        await service.getTaskById('123456');
      } catch (e) {
        expect(e).toBeInstanceOf(NotFoundException);
        expect(e.message).toBe('Task not found');
      }
    });
  });
});

 

Ответ №1:

Вы правильно освещаете модульные тесты. У меня есть 2 предложения по синтаксису:

  1. Вы можете определить mockTask непосредственно как объект вместо назначения функции стрелки
  2. Для тестового случая для проверки сценария ошибки вы можете использовать более чистый синтаксис (https://jestjs.io/docs/asynchronous#asyncawait) вместо try catch
 it("should throw task Not found error", async () => {
  const mockError = new NotFoundException("Task not found");
  tasksServiceMock.getTaskById = jest.fn().mockRejectedValue(mockError);

  expect.assertions(2);

  await expect(service.getTaskById("123456")).rejects.toThrowError(mockError);
});