当我尝试执行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);
});
});
});
答案 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>
backend = TestBed.get(HttpTestingController)
-这将同时测试网址,并“关闭”后端调用。这不会测试参数,如果查询中包含参数,则测试将失败。backend.expectOne(URL)
-如果您要测试带有参数的网址,backend.expectNone(URL)
无效。您必须使用expectOne()
。 Match不会自动关闭后端api调用,因此您可以在backend.match()
之后关闭它。expectNone()
-刷新将强制发送http呼叫的响应,然后关闭该呼叫。注意:如果在.flush(RESPONSE)
上调用flush,请注意匹配项是否返回数组,即match()
所有这些方法都将关闭http请求,并使backend.match(...)[0].flush({})
起作用。
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在将测试作为参数运行时提供的函数来实现。