Testing
Priority: P1 (HIGH)
1. Query via Component Harnesses
- Use
ComponentHarness(e.g.,MatButtonHarness) not CSS selectors — stable across DOM changes. loader.getHarness(MatButtonHarness)+await button.click(). Never query by CSS class.
See harness pattern for ComponentHarness examples.
2. Mock HTTP with HttpTestingController
provideHttpClientTesting()not manual HttpClient mocks.- Call
expectOne,.flush(mockData),verify()inafterEach.
See harness pattern for HttpTestingController examples.
3. Test Signal Inputs Correctly
fixture.componentRef.setInput('name', value)— not direct assignment.fixture.detectChanges()aftersetInput().- Signals sync — no
fakeAsyncneeded for most signal-driven tests.
4. Choose Your Test Runner
- Angular v20+: Vitest via
@angular/build:unit-test— faster, native ESM, no Karma. Configure inangular.json. - Jasmine/Karma still supported for existing projects.
- Standalone: import directly in
TestBed.configureTestingModule({ imports: [StandaloneComponent] }).
Anti-Patterns
- No DOM CSS selectors: Query via
ComponentHarness, not CSS class strings. - No manual HttpClient mock: Use
provideHttpClientTesting()+HttpTestingController. - No direct @Input() assignment: Use
fixture.componentRef.setInput()for signal inputs.