2015-04-22 59 views
5

我正在嘗試將$ urlRouterProvider注入到我的測試中,但我一直在收到未知的提供者問題。我使用ui.router和測試指令,需要能夠獲得訪問這些供應商,或所有的測試失敗......無法將提供者注入Karma測試

navbar.spec.js

'use strict'; 

describe('Directive: nav-bar', function() { 

    beforeEach(module('ui.router')); 
    beforeEach(module('ngMock')); 
    beforeEach(module('kitchenapp')); 


    var $httpBackend, 
    $templateCache, 
    $compile, 
    $urlRouterProvider, 
    $scope; 

    beforeEach(inject(function (_$httpBackend_, _$templateCache_, _$compile_, _$urlRouterProvider_) { 


    $httpBackend = _$httpBackend_; 
    $templateCache = _$templateCache_; 
    $compile = _$compile_; 
    $urlRouterProvider = _$urlRouterProvider_; 

    $urlRouterProvider.deferIntercept(); 

    $scope = $rootScope.$new(); 
    element = angular.element('<nav-bar></nav-bar>'); 
    element = $compile(element)(scope); 
    $rootScope.$$phase || $rootScope.$apply(); 


    })); 

    afterEach(function() { 
    $httpBackend.verifyNoOutstandingExpectation(); 
    $httpBackend.verifyNoOutstandingRequest(); 
    }); 

    it('\'s brand link should be titled \'KitchenApp\' and should navigate to the root address when clicked', function() { 

    expect(2).toEqual(2); 

    }); 


}); 

噶.conf.js

'use strict'; 

module.exports = function (config) { 
    config.set({ 

    basePath: 'client', 

    frameworks: ['jasmine'], 

    preprocessors: { 
     '**/*.html': ['ng-html2js'] 
    }, 

    ngHtml2JsPreprocessor: { 
     stripPrefix: 'client/', 
     moduleName: 'templates' 
    }, 

    plugins: [ 
     'karma-phantomjs-launcher', 
     'karma-jasmine', 
     'karma-ng-html2js-preprocessor' 
    ], 

    files: [ 
     'bower_components/angular/angular.js', 
     'bower_components/angular-ui-router/release/angular-ui-router.js', 
     'bower_components/angular-mocks/angular-mocks.js', 
     'bower_components/angular-bootstrap/ui-bootstrap-tpls.js', 
     'bower_components/angular-ui-grid/ui-grid.js', 
     'bower_components/angular-animate/angular-animate.js', 
     'bower_components/angular-sanitize/angular-sanitize.js', 
     'bower_components/angular-cookies/angular-cookies.js', 
     'bower_components/angular-resource/angular-resource.js', 
     'bower_components/angular-socket-io/socket.min.js', 
     'bower_components/angular-touch/angular-touch.js', 
     'bower_components/angular-bootstrap-calendar/dist/js/angular-bootstrap-calendar-tpls.js', 
     'app.js', 
     'views/**/*.js', 
     'services/**/*.js', 
     'directives/**/*.js', 
     'directives/**/*.html' 
    ], 

    exclude: [ 
     'views/**/*.e2e.js', 
     'services/socket/socket.service.js' 
    ], 

    reporters: ['progress'], 

    port: 9876, 

    colors: true, 

    // possible values: 
    // config.LOG_DISABLE 
    // config.LOG_ERROR 
    // config.LOG_WARN 
    // config.LOG_INFO 
    // config.LOG_DEBUG 
    logLevel: config.LOG_INFO, 

    autoWatch: false, 

    browsers: ['PhantomJS'], 

    singleRun: true 
    }); 
}; 

app.js

'use strict'; 

angular.module('kitchenapp', [ 
    //Native services 
    'ngCookies', 
    'ngResource', 
    'ngSanitize', 
    'ngAnimate', 
    'ngTouch', 

    //3rd party 
    'btford.socket-io', 
    'ui.router', 
    'ui.grid', 
    'mwl.calendar', 
    'ui.bootstrap' 
]) 
    .config(function ($stateProvider, $urlRouterProvider, $locationProvider, $httpProvider, calendarConfigProvider) { 

    $urlRouterProvider.otherwise('/'); 
    $locationProvider.html5Mode(true); 
    $httpProvider.interceptors.push('authInterceptor'); 

    calendarConfigProvider.configureDateFormats({ 
     hour: 'HH:mm' //this will configure the hour view to display in 24 hour format rather than the default of 12 hour 
    }); 

    calendarConfigProvider.configureTitleFormats({ 
     day: 'ddd D MMM' //this will configure the day view title to be shorter 
    }); 

    }) 
    .factory('authInterceptor', 
    function ($rootScope, $q, $cookieStore, $location) { 
    return { 

     request: function (config) { 
     config.headers = config.headers || {}; 
     if ($cookieStore.get('token')) { 
      config.headers.Authorization = 'Bearer ' + $cookieStore.get('token'); 
     } 
     return config; 
     }, 

     responseError: function (response) { 
     if (response.status === 401) { 
      $location.path('/login'); 
      $cookieStore.remove('token'); 
      return $q.reject(response); 
     } 
     else { 
      return $q.reject(response); 
     } 
     } 

    }; 
    }) 

    .run(function ($rootScope, $state, Auth) { 

    $rootScope.Auth = Auth; 
    //$rootScope.$on("$stateChangeError", console.log.bind(console)); 

    }); 

錯誤

Error: [$injector:unpr] Unknown provider: $urlRouterProviderProvider <- $urlRouterProvider 
http://errors.angularjs.org/1.3.15/$injector/unpr?p0=%24urlRouterProviderProvider%20%3C-%20%24urlRouterProvider 
    at /Users/jamessherry/sites/kitchenappFull/client/bower_components/angular/angular.js:4015 
    at getService (/Users/jamessherry/sites/kitchenappFull/client/bower_components/angular/angular.js:4162) 
    at /Users/jamessherry/sites/kitchenappFull/client/bower_components/angular/angular.js:4020 
    at getService (/Users/jamessherry/sites/kitchenappFull/client/bower_components/angular/angular.js:4162) 
    at invoke (/Users/jamessherry/sites/kitchenappFull/client/bower_components/angular/angular.js:4194) 
    at workFn (/Users/jamessherry/sites/kitchenappFull/client/bower_components/angular-mocks/angular-mocks.js:2436) 
undefined 
TypeError: 'undefined' is not an object (evaluating '$httpBackend.verifyNoOutstandingExpectation') 
    at /Users/jamessherry/sites/kitchenappFull/client/directives/nav-bar/nav-bar.spec.js:34 

任何幫助將不勝感激......

編輯 問題儘快提供注射要求的注射參數發生;我懷疑這就是爲什麼$ httpBackend不存在,因爲它在這一點上崩潰...

+0

你有沒有嘗試在角色文件列表中移動角度模擬?也許它應該在ui-router之前加載。 –

+0

嗨@DavinTryon,我試過玩的順序,但無濟於事...... :( – user1775718

回答

3

因此,它表明你不能注入'$ urlRouterProvider'到函數中,並期望$注入器找到它。也就是說,這將不起作用:

beforeEach(inject(function ($urlRouterProvider) { 

相反,你需要做的使用它模塊,像這樣:

beforeEach(module(function($urlRouterProvider) { 
     console.log('in', $urlRouterProvider); 
     $urlRouterProvider.deferIntercept(); 
    })); 
+0

謝謝,改變「注入」「模塊」解決了我的問題。 – user1882879

0

這個打字稿版本是:

beforeEach(this.module(function ($urlRouterProvider: angular.ui.IUrlRouterProvider) { 
    $urlRouterProvider.deferIntercept(); 
})); 

的「this. 「在module之前是必需的。

它也必須出現在任何beforeEach(inject(行之前。

相關問題