TestBed — это мощная утилита тестирования Angular, которая создает динамическую тестовую среду для компонентов, директив, сервисов и других Angular-артефактов. Это "виртуальный Angular модуль" специально для тестов.
Стандартная настройка для тестирования компонента:
import { TestBed } from '@angular/core/testing';
import { MyComponent } from './my.component';
describe('MyComponent', () => {
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyComponent],
imports: [/* необходимые модули */],
providers: [/* сервисы */]
});
});
it('should create', () => {
const fixture = TestBed.createComponent(MyComponent);
expect(fixture.componentInstance).toBeTruthy();
});
});
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
RouterTestingModule,
SharedModule.forRoot()
]
});
TestBed.configureTestingModule({
declarations: [
MyComponent,
MockComponent({ selector: 'app-child' }),
MyDirective
]
});
TestBed.configureTestingModule({
providers: [
MyService,
{ provide: API_URL, useValue: 'https://test.api' },
{ provide: MyService, useClass: MockMyService }
]
});
// Или через override
TestBed.overrideProvider(MyService, { useValue: mockService });
После настройки необходимо вызвать compileComponents()
для асинхронной компиляции:
beforeEach(async () => {
await TestBed.configureTestingModule({...}).compileComponents();
});
TestBed.overrideProvider(MyService, {
useValue: { getData: () => of([1, 2, 3]) }
});
TestBed.overrideComponent(MyComponent, {
set: { template: '<div>Mock</div>' }
});
Получение сервисов из инжектора:
const myService = TestBed.inject(MyService);
const http = TestBed.inject(HttpClient);
Полный пример настройки:
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ReactiveFormsModule],
declarations: [MyFormComponent],
providers: [
{ provide: DataService, useClass: MockDataService },
FormBuilder
],
schemas: [CUSTOM_ELEMENTS_SCHEMA] // Для игнорирования неизвестных элементов
})
.compileComponents();
});
"Can't bind to 'ngModel'":
FormsModule
в imports"No provider for HttpClient":
HttpClientTestingModule
"Component is not part of any NgModule":
Асинхронные операции:
async/fakeAsync
для тестов с асинхронным кодомbeforeAll(() => {
TestBed.initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
});
const setupTestBed = (moduleDef: TestModuleMetadata) => {
let testBed: typeof TestBed;
beforeEach(() => {
testBed = TestBed.configureTestingModule(moduleDef);
});
return testBed;
};
function configureTestingModule(providers: Provider[] = []) {
TestBed.configureTestingModule({
imports: [CoreModule],
providers: [...providers]
});
}
resetTestingModule
между тестами:afterEach(() => {
TestBed.resetTestingModule();
});
Минимизируйте конфигурацию - настраивайте только необходимое
Выносите общую конфигурацию в отдельные функции
Используйте моки для сложных зависимостей
TestBed — это центральный инструмент для тестирования Angular приложений, предоставляющий полный контроль над тестовой средой. Правильная настройка TestBed значительно упрощает написание надежных и поддерживаемых тестов. Начинайте с простой конфигурации, постепенно добавляя необходимые модули и провайдеры по мере усложнения тестовых сценариев.