Test Doubles — это общее название для объектов-заменителей, используемых в тестировании вместо реальных зависимостей. Они помогают изолировать тестируемый код и контролировать поведение зависимостей. В Angular-тестировании чаще всего применяются три основных типа:
Мок — полностью фейковый объект с предопределённым поведением.
// Пример мока сервиса
const authServiceMock = {
isAuthenticated: jasmine.createSpy('isAuthenticated').and.returnValue(true),
login: jasmine.createSpy('login').and.returnValue(of({ success: true }))
};
TestBed.configureTestingModule({
providers: [
{ provide: AuthService, useValue: authServiceMock }
]
});
Когда использовать:
Spy — обёртка вокруг реального объекта, позволяющая отслеживать вызовы методов без изменения их поведения (или с частичной подменой).
// Пример использования spyOn
const realService = TestBed.inject(DataService);
spyOn(realService, 'fetchData').and.callThrough(); // Реальный метод
spyOn(realService, 'saveData').and.returnValue(of(null)); // Подмена
Когда использовать:
Stub — упрощённая реализация зависимости с жёстко заданными возвращаемыми значениями.
// Пример стаба
class LoggerStub {
log(message: string) {
return '[STUBBED]: ' + message;
}
}
TestBed.configureTestingModule({
providers: [
{ provide: LoggerService, useClass: LoggerStub }
]
});
Когда использовать:
Характеристика | Mock | Spy | Stub |
---|---|---|---|
Реальная логика | ❌ Нет | ✅ Частично | ❌ Нет |
Подмена возврата | ✅ Да | ✅ Да | ✅ Да |
Отслеживание вызовов | ✅ Да | ✅ Да | ❌ Нет |
Сложность создания | ⚠️ Средняя | ✅ Низкая | ⚠️ Средняя |
const httpMock = {
get: jasmine.createSpy('get').and.returnValue(of(mockData))
};
// В тесте:
expect(httpMock.get).toHaveBeenCalledWith('/api/data');
const component = fixture.componentInstance;
spyOn(component, 'onSubmit').and.callThrough();
// После действия:
expect(component.onSubmit).toHaveBeenCalled();
const routerStub = {
navigate: jasmine.createSpy('navigate')
};
// Проверка:
expect(routerStub.navigate).toHaveBeenCalledWith(['/login']);
Test Doubles — важнейший инструмент для изолированного тестирования. Mocks лучше для полной подмены, Spies — для отслеживания вызовов реальных методов, Stubs — для простых предсказуемых реализаций. В Angular-тестах чаще всего используются комбинации этих подходов через TestBed и Jasmine spies.