确保$ httpBackend刷新一系列请求

确保$ httpBackend刷新一系列请求

问题描述:

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

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

不幸的是,该服务打了很多电话给自己的功能,其中许多电话使用角度服务进一步拨打电话。它这样做是为了填充用户数据,区域设置和其他定制产品信息等对象。我只想说我不能将服务重构为更好的架构;我必须简单地构建这个测试。

因为有这么多的电话$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()就足够了?如果这还不够,我该怎么办?

您不需要为每个请求调用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()。没有看到所测试的代码是我能够提供的所有帮助。

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