注入器为$ httpBackend返回undefined

时间:2017-03-22 16:40:25

标签: angularjs karma-jasmine

我一直在研究我正在为Angular(我的第一个)做的项目的单元测试。我已经设置了一个依赖于NodeFactory的DataTree服务,并且还进行$ http调用。

首先,我的测试(摘录):

describe("the data tree service", function() {

  let DataTree, NodeFactory, $httpBackend;

  beforeEach(module('memApp.common'));

  beforeEach( inject(function(_DataTree_, _NodeFactory_, _$httpBackend_) {
      DataTree = _DataTree_;
      NodeFactory = _NodeFactory_;
      $httpBackend = _$httpBackend_;
  }));

  describe("is sane, so it", function() {

      $httpBackend
        .when('GET', 'json/home.json')
        .respond(200, {
            "esv": {
                "_title" : "ESV",
                "_filePath" : "json/bookData.json"
            }
        });

      ...
  }
...
}

它正在尝试使用JSON设置模拟后端。

我的Karma测试在$ httpBackend.when失败了,特别是:

TypeError: Cannot read property 'when' of undefined
        at <the httpBackend.when call>

我的DataTree服务(服务服务 - 只需要一个全局实例):

(function() {
    angular.module('memApp.common')
        .service('DataTree', ['NodeFactory', '$http', '$q',    
    function(NodeFactory, $http, $q) {
    ...
    }]);
})();

我的NodeFactory工厂 - 类的包装器:

(function() {
    angular.module('memApp.common')
        .factory('NodeFactory', function() {
    ....
    });
})();

最后,我收录了karma.conf.js文件:

files: [
  'bower_components/angular/angular.min.js',
  'bower_components/angular-mocks/angular-mocks.js',
  'bower_components/angular-route/angular-route.js',
  'js/common/common.module.js',     //memApp.common module def'd here
  'js/common/node.service.js',      //NodeFactory def'd here
  'js/common/datatree.service.js',  //DataTree def'd here
  'js/common/common.controller.js',
  'js/hierarchy/hierarchy.module.js',
  'js/hierarchy/hierarchy.controller.js',
  'js/rehearsal/rehearsal.module.js',
  'js/rehearsal/rehearsal.controller.js',
  'js/app/app.module.js',
  'js/hierarchy/hierarchy.directive.js',
  'js/rehearsal/rehearsal.directive.js',
  'spec/*Spec.js'                   //all Jasmine tests here - in particular, there is a test suite for NodeFactory here.
],

我不认为这是相关的,但是NodeFactory的测试会做到以下几点(我之前已经被其他测试所做的灼烧......):

describe("the Node service", function() {

    let NodeFactory;
    let home;

    beforeEach(module('memApp.common'));

    beforeEach( inject(function(_NodeFactory_) {
        NodeFactory = _NodeFactory_;
        home = NodeFactory.create();
    }));
    ...
});

我已经在我的数据树服务中进行了测试,无需使用$ httpBackend进行任何操作。这种情况让我担心,因为我认为我的服务不应该在单元测试中进行实际的$ http调用?

我是ng-mock的新手(并且正在参加关于这个主题的PluralSight课程),但是我试图跟进我的项目,这阻碍了我做多少事情。一般来说,$ httpBackend仍然感觉有点神奇。

1 个答案:

答案 0 :(得分:1)

嗯,嘿......写出我的问题有时会在很长的路要走。 (我发誓花了一天时间看这个。)

我对$ httpBackend的调用没有包含在测试中(只是一个描述块),所以之前没有调用beforeEach。我将代码移动到它...测试,现在注入工作。