【问题标题】:AngularJS, jasmine unit test throws 'Unknown provider' errorAngularJS,茉莉花单元测试抛出“未知提供者”错误
【发布时间】:2014-03-04 02:08:13
【问题描述】:

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

我已将我的规范简化为尽可能简单,但我无法克服 Unknown provider 错误。

这是规范

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()
  })
})

【问题讨论】:

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


    【解决方案1】:
    Viewfinder.config(['$routeProvider', '$locationProvider', 'assetPathProvider', function($routeProvider, $locationProvider, assetPathProvider)
    

    将在之前执行

    Viewfinder.provider('assetPath'
    

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

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

    配置块 - 在提供者注册期间执行 和配置阶段。只能注入提供者和常量 进入配置块。这是为了防止意外实例化 在完全配置之前的服务。运行块 - 获取 在注入器创建后执行并用于启动 应用。只有实例和常量可以注入运行 块。这是为了防止在 应用程序运行时间。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多