0

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

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

[$injector:unpr] Unknown provider: $qProvider <- $q <- XFactory

Даже если я каким-то образом удалить $ д и $ HTTP услуг, я все еще получаю эту ошибку в этом измененном виде:

[$injector:unpr] Unknown provider: APIHelperProvider <- APIHelper <- XFactory

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

ответ

0

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

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

APIHelper служба не определена в модуле Test и, таким образом, не имеется.

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

Рассмотрите возможность использования вместо этого предложил метод инъекции в спецификации, inject.

+0

Это как определяется служба APIHelper (в APIHelper.js) angular.module ('Test'). Factory ('APIHelper', function() { // код здесь }); Значит, не определено ли это в тестовом модуле? Кроме того, фрагмент кода, который вы предоставили, где он должен быть включен в тестовый файл? – leMS

+0

Хорошо, включая этот var $ injector = angular.injector (['ng', 'ngMock', 'Test']); ничего не меняет – leMS

+0

Он все еще бросает '$ qProvider <- $ q <- XFactory'? Вы не разместили весь соответствующий код. Не очевидно, что файл, в котором загружен 'angular.module ('Test'). Factory ('APIHelper' ...'. И не очевидно, что он был загружен после 'angular.module ('Test, [. ..]) 'определение модуля - в противном случае он выдаст ошибку. – estus

0

ИТАК я .. понял, как заставить его работать это было в основном связаны Карма проблема, я просто изменил порядок файлов, что карма была ссылающихся на Так что я изменил это:.

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

Я просто поменялись местами конфигурационного файла и файла APIHelper и просто сделал тестовый проход.

Кроме того, я думаю, что это может быть полезно упомянуть, что любой из следующего синтаксиса будет работать для инъекций услуги:

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


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


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

     expect(target).to.be.ok; 

    } 
]); 

 Смежные вопросы

  • Нет связанных вопросов^_^