Darren
Darren

Reputation: 275

Karma not executing any unit tests

I seem to be having a problem getting my Jasmine unit tests to actually execute. I have verified that all my scripts are getting loaded by setting the logLevel to LOG_DEBUG. My unit test is identical to the services test @ https://github.com/angular/angular-seed/blob/master/test/unit/servicesSpec.js.

Also, I have used Testacular (before it was renamed to Karma) and I don't recall having this issue. I seem to get Chrome to run, but I have to manually hit a "Debug" button. Even when I hit this button my tests don't run.

System details:

Here's my module code (Scripts/main.js):

angular.module('sb.services', []).value('version', '0.0.1').value('amplify', amplify);
angular.module('sb.directives', []);
angular.module('sb.filters', []);
angular.module('sb.controllers', []).controller('SbController', [
    '$scope', 
    'amplify', 
    function ($scope, amplify) {
        $scope.message = 'Hello World! (amplify exists?=' + !!amplify + ')';
    }
]);
angular.module('sb', [
    'sb.services',
    'sb.directives',
    'sb.filters',
    'sb.controllers'
]);

Here's my spec (Test/unit/servicesSpec.js):

'use strict';

describe('my services', function () {
    beforeEach(module('sb.services'));

    describe('version', function () {
        it('should return current version', inject(function(version) {
            expect(version).toEqual('0.0.1');
        }));
    });
});

Here's my karma.conf.js file:

// Karma configuration
// Generated on Mon Apr 15 2013 20:56:23 GMT-0400 (Eastern Daylight Time)


// base path, that will be used to resolve files and exclude
basePath = '';


// list of files / patterns to load in the browser
files = [
  JASMINE,
  JASMINE_ADAPTER,
  'Vendor/angular-1.0.6/angular.js',
  'Vendor/angular-1.0.6/angular-*.js',
  'Vendor/json2/json2.js',
  'Vendor/jquery/jquery-1.8.2.js',
  'Vendor/amplify/amplify.js',
  'Scripts/main.js',
  'Test/unit/*.js'
];


// list of files to exclude
exclude = [

];


// test results reporter to use
// possible values: 'dots', 'progress', 'junit'
reporters = ['progress'];


// web server port
port = 9876;


// cli runner port
runnerPort = 9100;


// enable / disable colors in the output (reporters and logs)
colors = true;


// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel = LOG_WARN;


// enable / disable watching file and executing tests whenever any file changes
autoWatch = false;


// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers = ['Chrome'];

junitReporter = {
    outputFile: 'Test/out/unit.xml',
    suite: 'unit'
};


// If browser does not capture in given timeout [ms], kill it
captureTimeout = 60000;


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

Upvotes: 25

Views: 21934

Answers (6)

vladCovaliov
vladCovaliov

Reputation: 4403

In my case singleRun was set to false

Solution: // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits singleRun: true

Upvotes: 3

KevBrew
KevBrew

Reputation: 111

I tried all above without success, until finally...

In my karma.conf.js I removed the requirejs dependency, eg:

    frameworks: ['jasmine', 'requirejs'],

to:

    frameworks: ['jasmine'],

Upvotes: 9

SnapShot
SnapShot

Reputation: 5544

In case you are trying to solve this issue using JASMINE and JASMINE_ADAPTER this is no longer supported (at least on Karma version 0.10.2).

Instead use:

frameworks: ['jasmine']

in your Karma config file. You can read about this here.

I also found that in my files array I had set included: false for a pattern. included is only used if you want to manually include your Javascript files (for example if you will be using require.js). If all your tests will be loaded from that pattern you will see a message similar to:

PhantomJS 1.9.2 (Linux): Executed 0 of 0 ERROR (0.151 secs / 0 secs)

since the file containing the tests is never included. Removing the included: false from the files array for my pattern fixed this since the default if included is not specified is true.

Upvotes: 7

Sly_cardinal
Sly_cardinal

Reputation: 12993

I just had the same issue and I found that I had to set autoWatch = true before Karma would run the tests automatically.

Upvotes: 15

Darren
Darren

Reputation: 9479

Alternatively you can use exclude section in your karma.conf.js

exclude = [
  'Vendor/angular-1.0.6/angular-scenario.js'
];

Upvotes: 14

Ryan Quinn
Ryan Quinn

Reputation: 1205

My last answer was wrong (moving the JASMINE and JASMINE_ADAPTER lines below the angular.js lines). It fixed this particular problem, but created other issues. Instead, what I did to fix it was to specify only the angular-mocks file, instead of angular-*, like so:

   JASMINE,
   JASMINE_ADAPTER,
  'Vendor/angular-1.0.6/angular.js',
  'Vendor/angular-1.0.6/angular-mocks.js',
  'Vendor/json2/json2.js',
  'Vendor/jquery/jquery-1.8.2.js',
  'Vendor/amplify/amplify.js',
  'Scripts/main.js',
  'Test/unit/*.js'

Upvotes: 12

Related Questions