我正在使用Jasmine来测试我的Angular应用程序。一些控制器使用单独的访问控制器进行扩展,为其提供初始化功能:
angular.module("myApp").controller("myCtrl", ["$scope", "someOtherServices", function($scope, someOtherServices) {
var _this = this;
$controller('accessController', { accessCtrl: _this });
// Some more functions
_this.init(function() {
// Load in the data
});
}]);
init函数来自使用Access服务的accessController,看起来像这样:
angular.module("myApp").controller("accessController", ["Access", "accessCtrl", function(Access, accessCtrl) {
//Some initial setup
accessCtrl.init = function (func) {
Access.checkPermissions().then(function() {
// Permissions specific config
func();
});
}]);
我的测试规范看起来像这样:
describe('myCtrl', function() {
beforeEach(module('myApp'));
var $controller;
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('someTest', function() {
var $scope, controller, Contacts;
beforeEach(function() {
$scope = {};
someOtherServices = {};
myCtrl = $controller('myCtrl', {$scope:$scope, someOtherServices: someOtherServices});
});
it ('Does something as expected', function() {
expect(myCtrl.someFunction).toBe(‘pass value’);
});
});
});
我得到的问题是控制器中的行$controller('accessController', { accessCtrl: _this });
,测试失败并显示错误:
Error: [$injector:unpr] Unknown provider: AccessProvider <- Access <- accessController
虽然我可以模拟注入控制器的服务,我正在直接测试,但我找不到一种模拟Access服务注入accessController的方法。怎么能实现这一目标?文档说&#34;如果需要测试嵌套的Controller,则必须在DOM中存在的测试中创建相同的作用域层次结构:&#34;但如果我在规范中创建了这个层次结构,它就不会在测试中使用。
答案 0 :(得分:0)
Access
被模仿为angular.mock.module
的任何其他服务:
beforeEach(module('myApp', {
Access: { ... }
}));
如果在控制器或其他任何地方使用它并不重要。