使用Karma测试Angular Factory(使用其他服务)

时间:2016-08-22 15:39:25

标签: angularjs unit-testing karma-runner karma-mocha angular-mock

我正在尝试使用Karma测试一堆Angular Services,但它一直遇到错误。基本上我有名为“ APIHelper.js ”和“ Config.js ”的文件。在这些文件中,我分别创建了工厂,即“ APIHelper ”和“配置”。 现在我有另一个文件“XFactory.js”,它定义了另一个实际使用“ APIHelper ”和“配置”的工厂。

我已经测试了APIHelper和Config工厂,我知道如何注入简单工厂并对其进行测试。但是,我在测试具有其他依赖性的“ XFactory ”时遇到了问题。

以下是APIHelper.js的代码:

angular.module('Test').factory('APIHelper', function() {

    appendContext:function(item, context){
        //code here
    }
});

以下是Config.js的代码

angular.module('TesterLib',[]).factory('Configuration', function() {
      //code here
});

以下是XFactory的代码:

'use strict';
angular.module('Test').factory('XFactory', function ($q, $http, APIHelper, Config) {

  function executeRequest(req) {
    .....
    .....
    //make the http call.
    var response = $http(convertedRequest);
    var deffered= $q.defer();

    response.then(function(resp){

      context.response = response;

      //Append the context to the body for easy access
      APIHelper.appendContext(response.body,context);
      deffered.resolve(response);

    },function(resp){
      //Create error
      var error = {message:resp.body,code:resp.statusCode};

      //Append the context to the error object
      APIHelper.appendContext(error,context);
      deffered.reject(error);
    });

      return deffered.promise;
  }

  return executeRequest;

});


    function executeRequest(req) {

        //Convert abstracted request to request's http request
        var convertedRequest = convertHttpRequest(req);

        //create a context to hold raw request and response
        var context = new HttpContext();
        context.request = req;

        //make the http call.
        var response = $http(convertedRequest);
        var deffered= $q.defer();

        response.then(function(resp){

            var response = convertHttpResponse(resp);
            context.response = response;

            //Append the context to the body for easy access
            APIHelper.appendContext(response.body,context);
            deffered.resolve(response);

        },function(resp){
            var response = convertHttpResponse(resp);
            context.response = response;
            //Create error
            var error = {message:response.body,code:response.statusCode};

            //Append the context to the error object
            APIHelper.appendContext(error,context);
            deffered.reject(error);
        });

        return deffered.promise;
    }
    return executeRequest;
});

这是测试代码(当用于APIHelper或Config工厂时,这非常有效):

describe('Basic Injection Test', function() {

  var scope = {};
  var ctrl;

  beforeEach(module('Test'));

  it('should check if injection is being made correctly',function(){


      var $injector = angular.injector(['Test']);
      ctrl = $injector.get('XFactory');

    expect(ctrl).to.be.ok;
  });

});

这是我在karma.conf文件中包含的文件:

  // list of files / patterns to load in the browser
    files: [
        '../angular.js',
        '../../node_modules/angular-mocks/angular-mocks.js',
        '../app.js',
        '../factory/APIHelper.js',
        '../factory/Config.js',
        '../factory/XFactory.js',
        'test.js'
    ],

注意:app.js具有以下内容:

var app = angular.module('Test',[]);

app.js正用于帮助Karma找到Test模块(在它发出错误之前找不到Test模块)

我正在使用Karma来运行测试。必要的文件已包含在karma.conf.js文件的“files”目标中。但是,当我运行测试时,我收到此错误:

  

[$ injector:unpr]未知提供商:$ qProvider< - $ q< - XFactory

即使我以某种方式删除$ q和$ http服务,我仍然会以这种修改后的形式出现此错误:

  

[$ injector:unpr]未知提供商:APIHelperProvider< - APIHelper< - XFactory

任何人都可以告诉我如何修复此错误并解释为什么会发生这种情况?我是Angular Unit Testing的新手。因此,我真的不知道如何解决这个问题。帮助将不胜感激:)

2 个答案:

答案 0 :(得分:0)

angular.injector创建一个新的注入器实例,默认情况下不加载核心ng模块。应明确加载ngngMock

var $injector = angular.injector(['ng', 'ngMock' 'Test']);

APIHelper服务未在Test模块中定义,因此无法使用。

在这种情况下,

module不会影响任何内容,因为它引用了另一个注入器(ngMock在规范中使用的注入器。

考虑在规范inject中使用建议的注射方法。

答案 1 :(得分:0)

好的,所以我想出了如何让它发挥作用。这基本上是一个与业力相关的问题。我只是改变了Karma链接到的文件的顺序。所以我改变了这个:

  // list of files / patterns to load in the browser
    files: [
        '../angular.js',
        '../../node_modules/angular-mocks/angular-mocks.js',
        '../app.js',
        '../factory/APIHelper.js',
        '../factory/Config.js',
        '../factory/XFactory.js',
        'test.js'
    ],

this

  // list of files / patterns to load in the browser
    files: [
        '../angular.js',
        '../../node_modules/angular-mocks/angular-mocks.js',
        '../app.js',
        '../factory/Config.js',
        '../factory/APIHelper.js',
        '../factory/XFactory.js',
        'test.js'
    ], 

我只是简单地切换了Config文件和APIHelper文件的位置,这只是让测试通过了。

除此之外,我认为在此提及以下任何语法都可用于注入服务可能会有所帮助:

inject(function(_XFactory_){
    ctrl = _XFactory_;
});


inject(function($injector) {
   ctrl = $injector.get('XFactory');
}); 


angular.mock.inject(['XFactory', function(target) {

      expect(target).to.be.ok;

    }
]);