Frontend
October 15, 2023

Тестирование в Angular с Jest: настройка и запуск тестов

Зачем нужны тесты в Angular

Тестирование - это важная часть разработки приложений. Оно позволяет убедиться, что код работает правильно и не содержит ошибок.

Проверяя разные части приложения - компоненты, сервисы, маршруты - с помощью тестов, мы можем:

  • Найти и исправить баги на ранних этапах
  • Убедиться, что новый код не сломал старый функционал
  • Рефакторить код без страха что-то сломать
  • Быстро проверить работает ли приложение после изменений

Короче, тесты делают разработку надежнее и позволяют экономить время!

Знакомимся с Jest

Для тестирования в Angular часто используют библиотеку Jest. Она умеет:

  • Запускать тесты очень быстро
  • Имитировать работу браузера и DOM
  • Генерировать тестовые данные
  • Показывать подробные результаты

Короче, с Jest тесты писать и запускать одно удовольствие!

Установка Jest

Чтобы начать писать тесты, нужно установить Jest.

Это легко сделать через команду:

npm install --save-dev jest jest-preset-angular @types/jest

Также нужно добавить настройки Jest в файл jest.config.js:

module.exports = {
  preset: 'jest-preset-angular',
  setupFilesAfterEnv: ['<rootDir>/setup-jest.ts']  
};

Вот и всё! Jest готов к работе.

Пишем первый тест

Давай напишем простой тест для компонента.

Создадим файл app.component.spec.ts рядом с компонентом:

import { AppComponent } from './app.component';

describe('AppComponent', () => {

  it('should create', () => {
    expect(AppComponent).toBeTruthy();
  });
  
});

Здесь мы проверяем, что компонент создаётся без ошибок.

Теперь запускаем тест через npm test. Jest выполнит тест и покажет результат - в нашем случае успешный.

Тестируем сервисы

Дальше давай напишем тест для сервиса.

Например, проверим метод getUsers() в сервисе UserService:

// Подставляем моки 
jest.mock('./user.model'); 

describe('UserService', () => {

  it('should return expected users', () => {
    const service = new UserService();
    
    // Проверяем возвращаемое значение
    expect(service.getUsers()).toEqual([{ 
      id: 1,
      name: 'John' 
    }]);
  });

});

Таким образом можно протестировать любой сервис и его методы!

Тестируем формы

При тестировании форм важно проверить их взаимодействие с DOM.

Например, для компонента с формой можно написать:

let fixture; 
let inputEl;

beforeEach(() => {
  // Создаём фикстуру
  fixture = TestBed.createComponent(SignupFormComponent);
  
  // Получаем ссылку на поле ввода
  inputEl = fixture.debugElement.query(By.css('input')); 
});

it('should update model on input', () => {
  // Вводим текст
  inputEl.triggerEventHandler('input', {target: {value: 'test'}});
  
  // Проверяем модель
  expect(fixture.componentInstance.model.name).toEqual('test');
});

Таким образом можно тестировать любые формы!

Тестируем маршрутизацию

Маршрутизацию тоже важно протестировать.

Для этого используем специальные методы маршрутизатора:

let router: Router;
beforeEach(() => {
  router = TestBed.get(Router); // получаем роутер
  
  // Настраиваем маршруты
  TestBed.configureTestingModule({
    imports: [
      RouterTestingModule.withRoutes([
        { path: 'users', component: UsersComponent }  
      ])
    ]
  });
});

it('should navigate to users page', () => {
  // Переходим по маршруту
  router.navigate(['users']); 
  
  // Проверяем URL
  expect(router.url).toEqual('/users'); 
});

Запускаем тесты автоматически

Чтобы тесты запускались автоматически при изменениях в коде, можно использовать watch mode:

npm run test — --watch

Теперь после каждого сохранения Jest перезапустит тесты. Удобно при разработке!

Также можно настроить запуск тестов на CI серверах при каждом коммите.

Итог

В общем, тестирование - это крутая штука, которая делает разработку надёжнее и быстрее. С помощью Jest тесты для Angular писать и запускать достаточно удобно.