Тестирование 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;
}
]);