Angular Jasmine UI 路由器将解析值注入测试
Angular Jasmine UI router inject resolve value into test
在我的 Angular 应用程序中,UI 路由器将承诺解析为控制器。当尝试测试这个控制器时,Karma 抱怨一个未知的供应商。如何将假对象注入测试以表示此解析对象。
我的应用代码如下所示:
angular.module('myapp')
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('tab.name', {
...
resolve: {
allTemplates: function(Templates) {
return Templates.all().then(function(templates) {
return templates;
});
}
}
})
})
.controller('QueriesCtrl', function(allTemplates, UserQuery) {
var vm = this;
vm.queries = allTemplates;
vm.goToUrl = function(index, data) {
var processedUrl = UserQuery.process(data, vm.queryTyped[index]);
UserQuery.goToUrl(processedUrl);
};
});
尝试 运行 测试时出现错误
Unknown provider: allTemplatesProvider <- allTemplates <- QueriesCtrl
我试过创建间谍并注入它,但这不起作用。这是我目前的测试:
describe('Unit: queriesCtrl', function() {
var controller,
scope,
UserQuery;
beforeEach(function() {
module('myapp');
inject(function($injector) {
UserQuery = $injector.get('UserQuery');
allTemplates = jasmine.createSpyObj('allTemplates', [{a:1}, {a:2}, {b:3}]);
});
});
describe('goToUrl', function() {
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
controller = $controller('QueriesCtrl as ctrl', {
'$scope': scope
});
}));
it('should call UserQuery.process()', function() {
spyOn(UserQuery, 'process');
scope.ctrl.goToUrl();
expect(UserQuery.process).toHaveBeenCalled();
});
});
});
由于单元测试中不涉及路由,因此您必须将 allTemplates
作为具有 $controller
函数的普通对象注入。你能试试吗:
controller = $controller('QueriesCtrl as ctrl', {
'$scope': scope,
'allTemplates':allTemplates
});
否则您可以使用 $provide
API 创建虚拟服务。
module(function ($provide) {
$provide.value("allTemplates", {[{a:1}, {a:2}, {b:3}]});
在你的 beforEach
块中做第一件事。
在我的 Angular 应用程序中,UI 路由器将承诺解析为控制器。当尝试测试这个控制器时,Karma 抱怨一个未知的供应商。如何将假对象注入测试以表示此解析对象。
我的应用代码如下所示:
angular.module('myapp')
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('tab.name', {
...
resolve: {
allTemplates: function(Templates) {
return Templates.all().then(function(templates) {
return templates;
});
}
}
})
})
.controller('QueriesCtrl', function(allTemplates, UserQuery) {
var vm = this;
vm.queries = allTemplates;
vm.goToUrl = function(index, data) {
var processedUrl = UserQuery.process(data, vm.queryTyped[index]);
UserQuery.goToUrl(processedUrl);
};
});
尝试 运行 测试时出现错误
Unknown provider: allTemplatesProvider <- allTemplates <- QueriesCtrl
我试过创建间谍并注入它,但这不起作用。这是我目前的测试:
describe('Unit: queriesCtrl', function() {
var controller,
scope,
UserQuery;
beforeEach(function() {
module('myapp');
inject(function($injector) {
UserQuery = $injector.get('UserQuery');
allTemplates = jasmine.createSpyObj('allTemplates', [{a:1}, {a:2}, {b:3}]);
});
});
describe('goToUrl', function() {
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
controller = $controller('QueriesCtrl as ctrl', {
'$scope': scope
});
}));
it('should call UserQuery.process()', function() {
spyOn(UserQuery, 'process');
scope.ctrl.goToUrl();
expect(UserQuery.process).toHaveBeenCalled();
});
});
});
由于单元测试中不涉及路由,因此您必须将 allTemplates
作为具有 $controller
函数的普通对象注入。你能试试吗:
controller = $controller('QueriesCtrl as ctrl', {
'$scope': scope,
'allTemplates':allTemplates
});
否则您可以使用 $provide
API 创建虚拟服务。
module(function ($provide) {
$provide.value("allTemplates", {[{a:1}, {a:2}, {b:3}]});
在你的 beforEach
块中做第一件事。