当我尝试执行HTTP单元测试用例时,我收到此错误
我正在使用Angular 5.我该如何解决这个问题
import { TestBed } from '@angular/core/testing'; import { HttpClientTestingModule,HttpTestingController,TestRequest } from '@angular/common/http/testing'; import { DangerService } from './danger.service'; import { DangerFlag } from '../danger.model'; describe('DataService Tests',() => { let dataService: DangerService; let httpTestingController: HttpTestingController; let testDangerFlags: DangerFlag[] = [ "sample data" ] beforeEach(() => { TestBed.configureTestingModule({ imports: [ HttpClientTestingModule ],providers: [ DangerService ] }); dataService = TestBed.get(DangerService); httpTestingController = TestBed.get(HttpTestingController); }); afterEach(() => { httpTestingController.verify(); }); fit('should get all danger flags',() => { dataService.getDangerFlagDetails() .subscribe((data: DangerFlag[]) => { expect(data.length).toBe(3); }); }); });
解决方法
@H_301_21@
Expected no open requests,found 1
当您发出模拟请求时会发生这种情况,但不会“完成/关闭”它.运行测试后,打开的请求可能会保持打开状态,最终导致内存泄漏,尤其是在多次运行测试时.
就客户端而言,订阅模拟请求会调用它,但就后端而言,它不会“完成”它. “完成”请求可以通过多种方式完成;
backend = TestBed.get(HttpTestingController)
> backend.expectOne(URL) – 这将测试一个url,并’关闭’后端调用.这不会测试params,如果你的查询中有params,它将失败.
> backend.expectNone(URL) – 如果您正在测试具有参数的网址,expectOne()将无法正常工作.你必须使用backend.match().匹配不会自动关闭后端api调用,因此您可以在它之后使用expectNone()来关闭它.
> .flush(RESPONSE) – flush将强制发送http呼叫的响应,然后关闭呼叫.注意:如果在match()上调用flush,请注意返回数组的匹配,即backend.match(…)[0] .flush({})
这些方法中的任何一个都将关闭http请求,并使backend.verify()表现出来.
参考
>您可以找到深入的例子,以及更多解释here
> expectOne(),expectNone()和match()都返回TestRequest的实例