错误:预计没有打开的请求,发现 1

问题描述 投票:0回答:5

当我尝试执行 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);
        });
    });
});
angular unit-testing
5个回答
24
投票

预计没有开放请求,发现 1

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

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

backend = TestBed.get(HttpTestingController)

  1. backend.expectOne(URL)
    - 这将测试 url,并“关闭”后端调用。这不会测试参数,如果您的查询中有参数,则会失败。
  2. backend.expectNone(URL)
    - 如果您正在测试具有参数的网址,
    expectOne()
    将不起作用。您必须使用
    backend.match()
    。 Match 不会自动关闭后端 api 调用,因此您可以在其后按
    expectNone()
    将其关闭。
  3. .flush(RESPONSE)
    - 刷新将强制发送http调用的响应,然后关闭调用。注意:如果在
    match()
    上调用flush,请注意返回数组的匹配,即
    backend.match(...)[0].flush({})

这些方法中的任何一个都会关闭 http 请求,并使

backend.verify()
正常工作。

参考文献

  • 您可以找到深入的示例和更多解释这里
  • expectOne()
    match()
    返回 TestRequest
  • 的实例
  • expectNone()
    总是返回
    void

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 */
}

4
投票

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

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

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


0
投票

首先添加 expectOne 函数调用,如果不能解决那么尝试下面可能会对你有帮助

有时验证部分可能会出错,请添加警报或控制台来验证在我的情况下发生的真实情况,

          service.authenticate(model).subscribe(token => {
                expect(token).toBeTruthy();
                expect(token).toBeDefined();
            });
            const request = httpTestingController.expectOne(req =>{
              console.log("url: ", request.url);
              return  req.method === 'GET' && req.url === URL
            });
            expect(request.request.method).toBe('GET');
            request.flush(response);

希望能解决问题:)

快乐编码!!!


0
投票

错误👇👇

由于我的小错误,我的 Free Fire 帐户已被暂停。我想请求您检查一次我的帐户并将其取消暂停。我为自己的错误感到羞耻,我向你保证,我以后再也不会犯这样的错误了。2501833772

© www.soinside.com 2019 - 2024. All rights reserved.