确保为一系列请求刷新 $httpBackend

Ensuring $httpBackend flush for series of requests

我需要使用 jasmine/karma.

测试在 Angular 1.5.9 下实施的内部 angular 服务

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

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

由于对 $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() 就足够了?如果这还不够,我该怎么办?

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

您无需为发出的每个请求调用 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()在链中。没有看到正在测试的代码,这就是我能够提供的所有帮助。