确保为一系列请求刷新 $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()
在链中。没有看到正在测试的代码,这就是我能够提供的所有帮助。
我需要使用 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()
在链中。没有看到正在测试的代码,这就是我能够提供的所有帮助。