当我尝试执行HTTP单元测试用例时,我收到此错误
我正在使用Angular 5.我该如何解决这个问题
下面是我正常GET的代码.下面的代码只是带来正常的GET
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);
});
});
});
Run Code Online (Sandbox Code Playgroud)
小智 11
预计没有公开要求,发现1
当您发出模拟请求时会发生这种情况,但不会"完成/关闭"它.运行测试后,打开的请求可能会保持打开状态,最终导致内存泄漏,尤其是在多次运行测试时.
就客户端而言,订阅模拟请求会调用它,但就后端而言,它不会"完成"它."完成"请求可以通过多种方式完成;
backend = TestBed.get(HttpTestingController)
backend.expectOne(URL) - 这将测试一个网址,并"关闭"后端电话.这不会测试params,如果你的查询中有params,它将失败.backend.expectNone(URL)- 如果你正在测试有params的网址,就expectOne()不会工作.你必须使用backend.match().匹配不会自动关闭后端api调用,因此您可以expectNone()在其后关闭它..flush(RESPONSE) - flush将强制发送http呼叫的响应,然后关闭呼叫.注意:如果在a上调用flush match(),请注意返回数组的匹配,即backend.match(...)[0].flush({})任何这些方法都将关闭http请求,并使其backend.verify()行为.
expectOne(),expectNone()和match()所有返回TestRequest的实例我今天也遇到了这个问题。添加expectOne函数调用
it('should get all danger flags', () => {
const actualDangerFlags = createDangerFlagResponse();
dataService.getDangerFlagDetails()
.subscribe((actualDangerFlags) => {
expect(data.length).toBe(3);
});
});
const httpRequest = httpTestingController.expectOne(BASE_URL + relativeURL);
expect(httpRequest.request.method).toBe('GET');
httpRequest.flush(actualDangerFlags);
});
createDangerFlagResponse(): DangerFlag[] {
return /* DangerFlag Array */
}
Run Code Online (Sandbox Code Playgroud)
如果测试是异步的,您必须告诉 jasmine 它是异步的以及何时完成。
it('should get all danger flags', (done) =>{^
^^^^^^
dataService.getDangerFlagDetails()
.subscribe((data: DangerFlag[]) =>{
expect(data.length).toBe(3);
done();
^^^^^^
});
});
Run Code Online (Sandbox Code Playgroud)
您可以通过调用 jasmine 在作为参数运行测试时提供的函数来实现这一点。
| 归档时间: |
|
| 查看次数: |
8103 次 |
| 最近记录: |