我正在尝试为我的应用程序中的控制器编写一个简单的单元测试,但Jasmine正在抛出“未知提供程序”错误。我写的一个提供程序让我感到窒息,以帮助检索模板URL。提供程序被注入到配置函数中,因此我可以在routes.js中使用它。
我得到的具体错误是:Error: Unknown provider: assetPathProvider
这是我的 Karma配置:
files: [
'vendor/assets/javascripts/jquery.js',
'vendor/assets/javascripts/angular.js',
'spec/javascripts/lib/angular/angular-mocks.js',
'vendor/assets/javascripts/angular-*.js',
'vendor/assets/javascripts/*.js',
'app/assets/javascripts/initialize.js',
'app/assets/javascripts/**/*.js',
'spec/javascripts/unit/**/*.js'
],
我初始化我的应用,如下所示:
Viewfinder = angular.module('viewfinder', [
'ui.bootstrap',
'scroll',
'ngCookies',
'ngResource',
'chart',
'http-auth-interceptor',
'facebook-connect',
'twitter-connect',
'Alerts',
'smartTable.table',
'ngClipboard',
'angularFileUpload'
])
以下是 routes.js
的顶部Viewfinder.config(['$routeProvider', '$locationProvider', 'assetPathProvider', function($routeProvider, $locationProvider, assetPathProvider) {
提供程序用于检索routes.js
中的正确模板位置...
templateUrl: assetPathProvider.get('welcome/signed_in.html'),
....
以下是提供商本身:
Viewfinder.provider('assetPath', [function() {
this.get = function(path) {
if(angular.isDefined(gon.config.manifest)) {
return '/assets/' + gon.config.manifest[path]
} else {
return '/assets/' + path
}
}
this.$get = function() {
return {
get: this.get
}
}
}]);
我已经愚弄了我的规范尽可能简单,但我无法通过未知提供程序错误。
以下是规范:
describe('OneSheetPackagesViewController', function() {
var $rootScope, $scope, $controller, message
beforeEach(function() {
module('viewfinder', function(assetPathProvider) {})
})
beforeEach(inject(function(_$rootScope_) {
message = 'hello'
}))
it("should successfully submit a comment", function() {
console.log(message)
expect(message).toBeDefined()
})
})
答案 0 :(得分:0)
Viewfinder.config(['$routeProvider', '$locationProvider', 'assetPathProvider', function($routeProvider, $locationProvider, assetPathProvider)
将在
之前执行Viewfinder.provider('assetPath'
当配置正在执行时,assetPathProvider不可用。 http://docs.angularjs.org/guide/module
模块加载&依赖关系模块是一个集合 应用于应用程序的配置和运行块 在引导过程中。最简单的形式是模块组成 两种块的集合:
配置块 - 在提供商注册期间执行 和配置阶段。只能注入提供者和常量 到配置块。这是为了防止意外实例化 在完全配置之前的服务。跑块 - 得到 在创建注射器后执行并用于启动注射器 应用。只有实例和常量才能注入运行 块。这是为了防止进一步的系统配置 申请运行时间。
尝试在另一个角度模块中编写提供程序,并将其作为依赖项注入取景器。还要记住确保定义assetPath的文件出现在karma.conf
中的取景器之前