javascript / intermediate
Snippet
Testen der verzögerten Benutzersuche mittels fakeAsync und tick
Die fakeAsync-Testzone von Angular ermöglicht das deterministische, synchrone Testen asynchroner Operationen wie verzögerter Eingabeströme und Timer. Durch den Aufruf von tick(Millisekunden) wird die virtuelle Testuhr präzise vorgestellt, was asynchrone Verzögerungen ohne echte Wartezeit simuliert und verlässliche Überprüfungen von Zwischen- und Endzuständen erlaubt.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import { ComponentFixture, TestBed, fakeAsync, tick } from '@angular/core/testing';import { UserSearchComponent } from './user-search.component';import { UserService } from './user.service';import { of } from 'rxjs';describe('UserSearchComponent (fakeAsync)', () => {let component: UserSearchComponent;let fixture: ComponentFixture<UserSearchComponent>;let userServiceSpy: jasmine.SpyObj<UserService>;beforeEach(() => {userServiceSpy = jasmine.createSpyObj('UserService', ['searchUsers']);userServiceSpy.searchUsers.and.returnValue(of([{ id: '1', name: 'Dev User' }]));TestBed.configureTestingModule({imports: [UserSearchComponent],providers: [{ provide: UserService, useValue: userServiceSpy }]});fixture = TestBed.createComponent(UserSearchComponent);component = fixture.componentInstance;});it('triggers search only after debounce time', fakeAsync(() => {component.onSearchInput('developer');expect(userServiceSpy.searchUsers).not.toHaveBeenCalled();tick(300);expect(userServiceSpy.searchUsers).toHaveBeenCalledWith('developer');expect(component.results().length).toBe(1);}));});
angular
Erklärung
1
it('triggers search only after debounce time', fakeAsync(() => {
Hüllt den Test-Callback in die fakeAsync-Zone ein, um timerbasierte asynchrone Abläufe synchron zu steuern.
2
expect(userServiceSpy.searchUsers).not.toHaveBeenCalled();
Prüft, dass der asynchrone Suchaufruf vor Ablauf der Debounce-Zeitspanne noch nicht ausgeführt wurde.
3
tick(300);
Stellt die virtuelle Uhr um 300 Millisekunden vor, um den Timer ablaufen zu lassen und Mikrotasks auszuführen.