AngularJS,jasmine单元测试引发'未知提供者'错误

时间:2014-03-04 02:08:14

标签: javascript angularjs unit-testing jasmine karma-runner

我正在尝试为我的应用程序中的控制器编写一个简单的单元测试,但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()
  })
})

1 个答案:

答案 0 :(得分:0)

Viewfinder.config(['$routeProvider', '$locationProvider', 'assetPathProvider', function($routeProvider, $locationProvider, assetPathProvider)

将在

之前执行
Viewfinder.provider('assetPath'

当配置正在执行时,assetPathProvider不可用。 http://docs.angularjs.org/guide/module

  

模块加载&依赖关系模块是一个集合   应用于应用程序的配置和运行块   在引导过程中。最简单的形式是模块组成   两种块的集合:

     

配置块 - 在提供商注册期间执行   和配置阶段。只能注入提供者和常量   到配置块。这是为了防止意外实例化   在完全配置之前的服务。跑块 - 得到   在创建注射器后执行并用于启动注射器   应用。只有实例和常量才能注入运行   块。这是为了防止进一步的系统配置   申请运行时间。

尝试在另一个角度模块中编写提供程序,并将其作为依赖项注入取景器。还要记住确保定义assetPath的文件出现在karma.conf

中的取景器之前
相关问题