Question

I am having some issues running my karma tests.

I have this service that works well, in which I inject a constant CSRF_TOKEN :

'use strict';

angular.module('App').factory("AuthenticationService", function($http,    $sanitize, SessionService, FlashService, CSRF_TOKEN) {

   var sanitizeCredentials = function(credentials) {
       return {
           email: $sanitize(credentials.email),
           password: $sanitize(credentials.password),
           csrf_token: CSRF_TOKEN
       };
   };
...

But when running grunt test command, Karma's error is :

Error: [$injector:unpr] Unknown provider: CSRF_TOKENProvider <- CSRF_TOKEN <- AuthenticationService

UPDATE My Karma.conf :

// Karma configuration
// http://karma-runner.github.io/0.10/config/configuration-file.html

module.exports = function(config) {
  config.set({
    // base path, that will be used to resolve files and exclude
    basePath: '',

    // testing framework to use (jasmine/mocha/qunit/...)
    frameworks: ['jasmine'],

    // list of files / patterns to load in the browser
    files: [
      'app/bower_components/angular/angular.js',
      'app/bower_components/jquery/dist/jquery.js',
      'app/bower_components/angular-mocks/angular-mocks.js',
      'app/bower_components/angular-resource/angular-resource.js',
      'app/bower_components/angular-cookies/angular-cookies.js',
      'app/bower_components/angular-sanitize/angular-sanitize.js',
      'app/bower_components/angular-route/angular-route.js',
      'app/bower_components/xdomain/dist/0.6/xdomain.js',
      'app/bower_components/sass-bootstrap/dist/js/bootstrap.js',
      'app/bower_components/angular-bootstrap/ui-bootstrap-tpls.js',
      'app/scripts/*.js',
      'app/scripts/**/*.js',
      'test/mock/**/*.js',
      'test/spec/**/*.js'
    ],

    // list of files / patterns to exclude
    exclude: [],

    // web server port
    port: 8080,

    // level of logging
    // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
    logLevel: config.LOG_INFO,


    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: false,


    browsers: ['Chrome'],


    // Continuous Integration mode
    // if true, it capture browsers, run tests and exit
    singleRun: false
  });
};

And my constant defined in a bootstrap.js file to instantiate it before app starts :

'use strict';

angular.element(document).ready(function(){
    var app = angular.module('App');
    var $injector = angular.injector(['ng']);
    $injector.invoke(function($http, $rootScope) {
        $rootScope.$apply(function() {
            $http.get("http://something/token").then(function(response) {
                app.constant("CSRF_TOKEN", response.data.csrf_token);
                angular.bootstrap(document, ['App']);
            });
        });
    });
});

Do you know the solution so that Karma stop thinking my constant is a provider?

Was it helpful?

Solution

It seams like document's ready event is never thrown in your jasmine test and therefore constant is not defined in your App module. Try to mock CSRF_TOKEN constant in your module configuration section of the test:

JavaScript

describe('Test', function() {

  beforeEach(function() {
    module('App', function($provide) {
      $provide.constant('CSRF_TOKEN', 'MOCK_CONSTANT'); // <= mock your constant
    });
  });

  // Tests go here

});
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top