Can't setup Karma and Jasmine for Angularjs

Viewed 883

I've tried several tutorials and looked at many of the solutions provided here. I am new to Angular and currently trying to set up testing for a rather big SPA.

Following this tutorial I have completed:

  • Angularjs application setup
  • Karma setup
  • Our first test

The karma config file is basically the default content, with some references in files and exclude:

// list of files/patterns to load in the browser
 files: [
    'bower_components/angular/angular.js',
    'bower_components/angular-mocks/angular-mocks.js',
    'app/app.js',
    'JavaScript.spec.js'
],

I reinstalled the entire test implementation and now the simple test works again. But trying to write a test for a controller does not work:

here is the error message error output

I changed the path referencing the bower_components and app files in the karma config file. Now the shell running karma returns an error message from the app.js file, saying:

   Uncaught ReferenceError: Logging is not defined

Writing a test identical to the one from doucmentation, gives the following error:

error message

Here is the test code:

describe('nyKladdController', function () {
    beforeEach(module('app'));

    var $controller; 
    beforeEach(inject(function (_$controller_) {
        $controller = _$controller_; 
    }));


    describe('$scope.mixTable', function () {
        it('is false', function () {
            var $scope = {};
            var controller = $controller('nyKladdController', { $scope: $scope }); 
            expect($scope.mixTable).toBeFalsy();
        });
    }); 
});

As you can see from the error message: after the app module, the test file start loading the app dependencies. Here is the app.js file:

(function () {
    'use strict';
    angular.module('app', [
        'ngAnimate', 'ngRoute', 'ngSanitize', 'ngResource', 'ngMessages',
        'AdalAngular', 'config', 'angular.filter',
        'ui.bootstrap', 'ui.mask', 'ui.select', 'ui.validate',
        'angular-loading-bar', 'ui.tree', 'ui.tree-filter', 'checklist-model'
    ]);
})(); 

In other words: how can i get my tests to load the app dependecies as well.

3 Answers

I had to load in all the app dependencies from app.js in to karma.config file. Now the files array in karma config looks like this:

// list of files / patterns to load in the browser
files: [
    //bower modules
    './bower_components/angular/angular.js',
    './bower_components/angular-mocks/angular-mocks.js',
    './bower_components/angular-ui-mask/src/mask.js',
    './bower_components/angular-ui-select/dist/select.js',
    './bower_components/angular-ui-tree-filter/dist/angular-ui-tree-filter.js',
    './bower_components/angular-ui-tree/dist/angular-ui-tree.js',
    './bower_components/angular-ui-validate/dist/validate.js',
    './bower_components/angular-loading-bar/build/loading-bar.js',
    // node modules
    './node_modules/angular-animate/angular-animate.js',
    './node_modules/angular-route/angular-route.js', 
    './node_modules/angular-sanitize/angular-sanitize.js',
    './node_modules/angular-resource/angular-resource.js', 
    './node_modules/angular-messages/angular-messages.js',
    './node_modules/adal-angular/dist/adal-angular.min.js',
    './node_modules/angular-filter/dist/angular-filter.js',
    './node_modules/angular-ui-bootstrap/dist/ui-bootstrap.js', 
    './node_modules/bower-config/lib/Config.js',
    './node_modules/checklist-model/checklist-model.js',
    //app file
    './app/app.js',
    './app/common/config/config.js',
    //test files etc..
    'JavaScript.spec.js',
    './app/produkt/ny/controllers/*.js' // tester å hente inn controller som refereres i test filen
],

This may be because Karma is loading the source files in the wrong order. For Angular to work properly, each module must be loaded before any component, services, etc. associated with that module.

To fix this, you can change your Karma configuration to ensure your module files are loaded first.

// list of files / patterns to load in the browser
files: [
    '../../bower_components/angular/angular.js',
    '../../bower_components/angular-mocks/angular-mocks.js',
    'app/**/*.module.js',
    'app/**/*.js'
],

This is assuming you're using some kind of naming convention for angular modules (like *.module.js as in the above example). Otherwise you'll have to list the paths to the modules individually.

add beforeEach(module("your-module-name")); => your angular application name from app.js"

describe('check a controller', function () {

    beforeEach(module("your module name")); // I think you missed this.

    var scope, checkController; 

    beforeEach(inject(function ($rootScope, $controller) {
        scope = $rootScope.new(); 

        checkController = function () {
            return $controller('nyKladdController', {
                '$scope': scope
            });
        }; 
    }));

    it('has a dummy spec to test 2 + 2', function () {
        // An intentionally failing test. No code within expect() will never equal 4.
        expect(2 + 2).toEqual(4);
    });

});

karma.conf

files: [     // sample order. Include your files accordingly
            'src/bower_components/angular/angular.min.js',
            'src/bower_components/angular-mocks/angular-mocks.js',
             // some sample libraries 
            'src/bower_components/angular-cookies/angular-cookies.min.js',
            'src/bower_components/angular-ui-router/release/angular-ui-router.min.js',
            'src/bower_components/angular-resource/angular-resource.min.js',
            'src/bower_components/angular-sanitize/angular-sanitize.min.js',
            'src/bower_components/angular-loading-bar/build/loading-bar.min.js',

            'src/app/app.js',
            'src/app/**/*.js',
            'tests/unit/**/*.spec.js'
        ],
exclude: []
Related