当我尝试执行 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);
});
});
});
预计没有开放请求,发现 1
当您发出模拟请求但不“完成/关闭”它时,就会发生这种情况。运行测试后,打开的请求可能会保持打开状态,最终导致内存泄漏,尤其是在多次运行测试的情况下。
订阅模拟请求就客户端而言会调用它,但就后端而言不会“完成”它。 “完成”请求可以通过多种方式完成;
backend = TestBed.get(HttpTestingController)
backend.expectOne(URL)
- 这将测试 url,并“关闭”后端调用。这不会测试参数,如果您的查询中有参数,则会失败。backend.expectNone(URL)
- 如果您正在测试具有参数的网址,expectOne()
将不起作用。您必须使用backend.match()
。 Match 不会自动关闭后端 api 调用,因此您可以在其后按 expectNone()
将其关闭。.flush(RESPONSE)
- 刷新将强制发送http调用的响应,然后关闭调用。注意:如果在match()
上调用flush,请注意返回数组的匹配,即backend.match(...)[0].flush({})
这些方法中的任何一个都会关闭 http 请求,并使
backend.verify()
正常工作。
expectOne()
和 match()
返回 TestRequestexpectNone()
总是返回void
我今天也遇到这个问题了。添加 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 */
}
如果测试是异步的,您必须告诉 jasmine 它是异步的以及何时完成。
it('should get all danger flags', (done) =>{^
^^^^^^
dataService.getDangerFlagDetails()
.subscribe((data: DangerFlag[]) =>{
expect(data.length).toBe(3);
done();
^^^^^^
});
});
您可以通过调用 jasmine 在作为参数运行测试时提供的函数来实现这一点。
首先添加 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);
希望能解决问题:)
快乐编码!!!
错误👇👇
由于我的小错误,我的 Free Fire 帐户已被暂停。我想请求您检查一次我的帐户并将其取消暂停。我为自己的错误感到羞耻,我向你保证,我以后再也不会犯这样的错误了。2501833772