我正在尝试使用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的新手。因此,我真的不知道如何解决这个问题。帮助将不胜感激:)
答案 0 :(得分:0)
angular.injector
创建一个新的注入器实例,默认情况下不加载核心ng
模块。应明确加载ng
和ngMock
:
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;
}
]);