确保$ httpBackend刷新一系列请求

时间:2017-09-04 11:39:28

标签: angularjs karma-jasmine httpbackend

我需要测试在Angular 1.5.9下使用jasmine / karma实现的内部角度服务。

我需要编写一个测试,检查特定服务功能的响应是否符合预期。为此,我构建一个模拟对象,实例化服务,调用要测试的函数并使用expect().toBe()检查返回的值。

不幸的是,该服务会对其自己的函数进行大量调用,其中许多函数使用$http角度服务进行进一步调用。它这样做是为了填充诸如用户数据,区域设置和其他定制产品信息之类的对象。我只想说我无法将服务重构为更好的架构;我必须简单地构建这个测试。

由于对$http的调用太多,我打算使用以下一系列行来模拟它要求的所有数据:

var mockGetCartData = { "d": null, "message": null }; // at the top of the describe
$httpBackend.when('GET', /(.*)\/order\/api\/v1\/GetCart/).respond(200, mockGetCartData); // in the beforeEach

当我调用要测试的函数时,我立即调用$httpBackend.flush()但是,由于测试失败,我担心我需要做的是导致每个(伪造)$http调用在下一个之前被冲洗。

我是否需要执行此操作或设置所有$httpBackend.when().respond()条目,对测试函数执行操作,然后再调用单个flush()?如果这还不够,我该怎么办?

2 个答案:

答案 0 :(得分:2)

在刷新所有待处理请求时,您无需为每个请求调用flush()

请参阅文档https://docs.angularjs.org/api/ngMock/service/$httpBackend

来源https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1830

但是,如果被测方法中的$http个请求被链接在一起(因此后续请求仅在上一个请求被解析后进行),那么对于每个请求,您需要flush()链。没有看到测试中的代码,这是我能够提供的所有帮助。

答案 1 :(得分:0)

你必须在It块中模拟唯一需要的http调用,并在函数调用后刷新它。否则它将尝试刷新意外的http调用,这将导致错误。