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

时间:2018-03-22 13:40:42

标签: 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);
        });
    });
});

3 个答案:

答案 0 :(得分:7)

  

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

在您发出模拟请求但不“完成/关闭”该请求时会发生这种情况。测试运行后,打开的请求可能会保持打开状态,最终导致内存泄漏,尤其是如果测试多次运行。

订阅模拟请求就客户端而言调用它,但就后端而言并不“完成”它。可以通过多种方式“完成”请求;

<html> <head>dependencies in here, react, react-dom and babeljs</head> <body> <div id="Parent"></div> </body> <script src="src/parent/index.js"></script> <script src="src/parent/child/index.js"></script> </html>

  1. backend = TestBed.get(HttpTestingController)-这将同时测试网址,并“关闭”后端调用。这不会测试参数,如果查询中包含参数,则测试将失败。
  2. backend.expectOne(URL)-如果您要测试带有参数的网址,backend.expectNone(URL)无效。您必须使用expectOne()。 Match不会自动关闭后端api调用,因此您可以在backend.match()之后关闭它。
  3. expectNone()-刷新将强制发送http呼叫的响应,然后关闭该呼叫。注意:如果在.flush(RESPONSE)上调用flush,请注意匹配项是否返回数组,即match()

所有这些方法都将关闭http请求,并使backend.match(...)[0].flush({})起作用。

参考文献

  • 您可以找到更深入的示例,以及更多说明here
  • backend.verify()expectOne()expectNone()都返回TestRequest的实例

答案 1 :(得分:4)

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

答案 2 :(得分:2)

如果测试是异步的,你必须告诉jasmine它是异步的以及何时完成。

it('should get all danger flags', (done) =>{^
                                   ^^^^^^
    dataService.getDangerFlagDetails()
         .subscribe((data: DangerFlag[]) =>{
              expect(data.length).toBe(3);
              done();
              ^^^^^^
         });
});

您可以通过调用jasmine在将测试作为参数运行时提供的函数来实现。