Вы можете использовать fakeAsync
вместо async()
.Я создал компонент HTTP_INTERCEPTOR для возврата ответа через 1000 мс.Вот код
noop-interceptor.ts
import { Injectable } from '@angular/core';
import {
HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse
} from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';
/** Pass untouched request through to the next request handler. */
@Injectable()
export class NoopInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<HttpEvent<any>> {
let response = new HttpResponse();
response = response.clone({body: 'body'});
return of(response).pipe(delay(1000));
}
}
app.component.ts
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
data;
constructor(private http: HttpClient){}
getData(){
this.http.post('asd',{}).subscribe(data => {
console.log(data);
this.data = data;
});
}
}
app.component.html
<input type='button' (click)='getData()' value='Get Data' />
<div class='response'>{{data}}</div>
app.component.spec.ts
import { TestBed, async, ComponentFixture, tick, fakeAsync } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { NoopInterceptor } from './noop-interceptor';
import { By } from '@angular/platform-browser';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
imports: [
HttpClientModule
],
providers: [{ provide: HTTP_INTERCEPTORS, useClass: NoopInterceptor, multi: true }],
}).compileComponents();
}));
it('should create the app', async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
it('should return response',fakeAsync(()=>{
const fixture = TestBed.createComponent(AppComponent);
const component = fixture.debugElement.componentInstance;
fixture.detectChanges();
component.getData();
tick(1000);
fixture.detectChanges();
expect(component.data).toBe('body');
}));
it('should display response',fakeAsync(()=>{
const fixture = TestBed.createComponent(AppComponent);
const component = fixture.debugElement.componentInstance;
fixture.detectChanges();
component.getData();
tick(1000);
fixture.detectChanges();
let element = fixture.debugElement.query(By.css('.response')).nativeElement;
expect(element.textContent).toBe('body');
}));
});
Обратите внимание на tick(1000)
, это улучшит виртуальные часы
https://angular.io/guide/testing#the-tick-function
Вам нужнодо import 'zone.js/dist/zone-testing';
.Если бы проект был создан с использованием angular-cli, он уже был бы там в test.ts
Прочтите здесь руководство, чтобы узнать больше о тестировании asyc-сервисов:
https://angular.io/guide/testing#component-with-async-service