#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 предложения по синтаксису:
- Вы можете определить
mockTask
непосредственно как объект вместо назначения функции стрелки - Для тестового случая для проверки сценария ошибки вы можете использовать более чистый синтаксис (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);
});