【问题标题】:$rootScope.$apply in jasmine test triggers http GET from module茉莉花测试中的 $rootScope.$apply 从模块触发 http GET
【发布时间】:2016-06-16 15:52:52
【问题描述】:

我有一个 Jasmine 单元测试,它正在测试一个 Angular 控制器,其中一个函数返回一个 Promise 并用 Promise 的结果填充一个控制器字段。我正在对此进行测试以检查该字段是否已填充并调用 $rootScope.$apply 来解决承诺并设置值。

当调用 $rootScope.$apply 时,由于模块尝试在其配置设置中获取 json 文件,我收到错误。

Karma 显示错误与 $hhtpBackend 相关,并且来自 angular-mocks.js

Error: Unexpected request: GET /languages/en.json
No more request expected
       at $httpBackend (c:\dev\myapp\scrips\angular-mocks.js:1244:17)
       at sendReq (c:\dev\myapp\scripts\angular.js)
       at serverRequest (c:\dev\myapp\scripts\angular.js)
       at Scope.$eval
       at Scope.$digest
       at Scope.$apply

【问题讨论】:

    标签: angularjs unit-testing jasmine


    【解决方案1】:

    您需要告诉 Karma 等待电话。像下面这样的东西应该可以工作:

          // Note this is just for a typical test
          it('should make an http get request',function() {
            httpBackend.expectGET(fullUrlToGoTo).respond({data: 'Success'});
            // function that triggers the call
            httpBackend.flush();
          });
    

    但在您的情况下,因为它发生在设置部分,您需要将其移动到 beforeEach 函数中,并且我相信,确保在加载您的应用模块之前调用它。

    【讨论】:

    • 很棒,停止了我看到的错误,谢谢。我的承诺没有解决,但我现在会调查并弄清楚那部分
    • @AnthonyJoanes 没问题。承诺可能很烦人。正确的方法是注入$q并调用$q.defer()。然后,您将能够控制返回的承诺的哪一部分,即解决或拒绝
    • 感谢@Katana24。我现在使用 $q 服务和模拟我的服务依赖项来完成所有工作。感谢 $httpBackend 提示,我在上一个项目中使用了 chutzpah 并且不必以这种方式进行设置。
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多