Тестирование Angular Factory (которая использует другие сервисы) с помощью Karma

Я пытаюсь протестировать кучу Angular Services с использованием Karma, но он постоянно сталкивается с ошибками. В основном у меня есть файлы с именами " APIHelper.js " и " Config.js ". В этих файлах я создал фабрики " APIHelper " и " Config " соответственно. Теперь у меня есть другой файл "XFactory.js", который определяет другую фабрику, которая на самом деле использует " APIHelper " и " Config ".

Я тестировал фабрики 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 factory):

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 просто используется, чтобы помочь Карме найти тестовый модуль (до того, как он выдавал ошибку, невозможно найти тестовый модуль)

Я использую Карму для запуска тестов. Необходимые файлы были включены в цель "files" файла karma.conf.js. Однако, когда я запускаю тесты, я получаю эту ошибку:

[$ injector: unpr] Неизвестный поставщик: $qProvider <- $ q <- XFactory

Даже если я каким-либо образом удалим службы $ q и $http, я все равно получу эту ошибку в этой измененной форме:

[$ injector: unpr] Неизвестный поставщик: APIHelperProvider <- APIHelper <- XFactory

Может кто-нибудь сказать мне, как исправить эту ошибку, а также объяснить, почему это происходит? Я новичок в угловом модульном тестировании. Поэтому я не знаю, как решить эту проблему. Помощь будет оценена:)

2 ответа

angular.injector создает новый экземпляр инжектора и не загружает ядро ng модуль по умолчанию. ng а также ngMock должен быть загружен явно:

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

APIHelper услуга не определена в Test модуль и, следовательно, не доступен.

module Ничего не влияет в этом случае, потому что он ссылается на другой инжектор (тот, который используется ngMock в спецификациях.

Попробуйте использовать вместо предложенного метода впрыска в спецификации, inject,

Итак, я понял, как заставить это работать. Это была в основном проблема, связанная с кармой. Я просто изменил порядок файлов, на которые ссылалась Карма. Итак, я изменил это:

  // 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'
    ],

К этому

  // 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;

    }
]);
Другие вопросы по тегам