【问题标题】:Ensuring $httpBackend flush for series of requests确保 $httpBackend 刷新一系列请求
【发布时间】:2017-09-07 05:06:49
【问题描述】:

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

我需要编写一个测试来检查特定服务功能的响应是否符合预期。为此,我正在构造一个模拟对象,实例化服务,调用要测试的函数并使用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() 就够了吗?如果这还不够,我该怎么办?

【问题讨论】:

    标签: angularjs karma-jasmine httpbackend


    【解决方案1】:

    您不需要为每个发出的请求调用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()。在没有看到被测代码的情况下,这就是我所能提供的所有帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 2015-08-27
        • 2023-03-14
        • 2013-11-15
        • 1970-01-01
        相关资源
        最近更新 更多