错误:预计没有打开的请求,找到1

use*_*747 7 angular

当我尝试执行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)

  1. backend.expectOne(URL) - 这将测试一个网址,并"关闭"后端电话.这不会测试params,如果你的查询中有params,它将失败.
  2. backend.expectNone(URL)- 如果你正在测试有params的网址,就expectOne()不会工作.你必须使用backend.match().匹配不会自动关闭后端api调用,因此您可以expectNone()在其后关闭它.
  3. .flush(RESPONSE) - flush将强制发送http呼叫的响应,然后关闭呼叫.注意:如果在a上调用flush match(),请注意返回数组的匹配,即backend.match(...)[0].flush({})

任何这些方法都将关闭http请求,并使其backend.verify()行为.

参考

  • 您可以在此处找到深入的示例和更多解释
  • expectOne(),expectNone()match()所有返回TestRequest的实例

  • 深入示例链接已失效。答案中最好包含一个完整的测试示例。 (2认同)

Ron*_*nie 6

我今天也遇到了这个问题。添加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)


Leo*_*eon 4

如果测试是异步的,您必须告诉 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 在作为参数运行测试时提供的函数来实现这一点。