Тестирование в Angular делится на несколько уровней: юнит-тесты, интеграционные тесты и энд-то-энд тесты. Каждый уровень имеет свои цели, инструменты и методы.
Юнит-тесты проверяют отдельные компоненты, сервисы и пайпы. Для Angular используется Jasmine и тестовый раннер Karma. Основная цель — убедиться, что компонент работает корректно изолированно, без зависимости от внешних сервисов.
Пример теста компонента:
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [AppComponent],
imports: [HttpClientTestingModule]
}).compileComponents();
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
});
it('должен создать компонент', () => {
expect(component).toBeTruthy();
});
it('должен инициализировать значение title', () => {
expect(component.title).toEqual('AngularApp');
});
});
Проверяет взаимодействие между несколькими компонентами или между компонентом и сервисом. Часто используется TestBed, позволяющий создавать реальную среду работы компонента с модулями и сервисами.
Пример интеграционного теста с сервисом:
it('должен получать данные от сервиса', () => {
const service = TestBed.inject(DataService);
spyOn(service, 'getData').and.returnValue(of(['item1', 'item2']));
fixture.detectChanges();
expect(component.items.length).toBe(2);
});
E2E-тесты симулируют действия пользователя на реальном приложении. В Angular используется Protractor или Cypress. Они позволяют проверять навигацию, форму, клики и анимации в браузере.
Пример Cypress-теста:
describe('Главная страница', () => {
it('отображает заголовок', () => {
cy.visit('/');
cy.contains('h1', 'Добро пожаловать');
});
it('переход на страницу деталей', () => {
cy.get('a.details-link').click();
cy.url().should('include', '/details');
});
});
beforeEach для подготовки среды и
afterEach для очистки состояния.