角度测试[$ injector:unpr]未知提供者:STARTUP_CONFIG

时间:2014-12-06 13:21:52

标签: angularjs unit-testing jasmine

由于依赖项没有正确注入,我无法让我的测试运行。

我得到的错误在标题中定义。我已经包含了实际的测试代码,app.js&我的解决方案中的index.html文件。

问题在于延迟的引导程序,我不熟悉它,因为它被我的一位同事包括在内。如果我从app.js文件中删除“app.config(函数(STARTUP_CONFIG ...”),那么测试运行正常

如何在测试中正确注入STARTUP_CONFIG?

测试代码

..
..
describe("test description...", function () {

var app;
var mockupDataFactory;

beforeEach(module('Konstrukt'));

beforeEach(inject(function (STARTUP_CONFIG,BUDGETS,APPLICATIONS) {
    //failed attempt to inject STARTUP_CONFIG
}));

beforeEach(function () {
    app = angular.module("Konstrukt");
});

beforeEach(function () {
    mockupDataFactory = konstruktMockupData.getInstance();
});

it('should be accessible in app module', function () {
    expect(app.pivotTableService).toNotBe(null); //this test runs fine
});

it('test decr...', inject(function ( pivotTableService) {
    ... //Fails here
..
..

app.js

  ..
    ..        
    angular.module('Konstrukt', ['ngGrid', 'ngSanitize', 'ngRoute','pasvaz.bindonce', 'ngAnimate', 'nvd3ChartDirectives', 'ui.select', 'ngProgress', 'ui.grid', 'ui.grid.edit','ui.grid.selection', 'ui.grid.cellNav', 'ui.grid.pinning', 'ui.grid.resizeColumns']);

          var app = angular.module('Konstrukt');
          app.config(function (STARTUP_CONFIG, BUDGETS, APPLICATIONS) {

        var STARTUP_CONFIG = STARTUP_CONFIG;
        var BUDGETS = BUDGETS;
        var APPLICATIONS = APPLICATIONS;

      });
      ..
      ..

的index.html

    ..
    ..

    <script>
  setTimeout(function(){
  window.deferredBootstrapper.bootstrap({
    element: window.document.body,
    module: 'Konstrukt',
    resolve: {
      STARTUP_CONFIG: ['$http', function ($http) {
        return $http.get('/scripts/_JSON/activeBudgets.JSON');
      }],
      BUDGETS: ['$http', function ($http) {
        return $http.get('/scripts/_JSON/activeBudgets.JSON');
      }],
      APPLICATIONS: ['$http', function ($http) {
        return $http.get('/scripts/_JSON/applications.JSON');
      }]
    }
  })
  } , 1500);
</script>

1 个答案:

答案 0 :(得分:1)

deferredBootstrapper不会在您的单元测试中运行,这意味着它通常会添加到您的模块中的常量将无法使用。

您可以添加提供模拟版本的全局beforeEach

beforeEach(function () {
  module(function ($provide) {
    $provide.constant('STARTUP_CONFIG', { something: 'something' });
    $provide.constant('BUDGETS', { something: 'something' });
    $provide.constant('APPLICATIONS', { something: 'something' });
  });
});