Replacing karma with jasmine-node for my AngularJS tests?

1.2k Views Asked by At

Jasmine AngularJS test (passes in karma start configs/karma.conf.js)

describe('IndexController', function () {
    beforeEach(module('myApp'));

    var ctrl, scope;

    beforeEach(inject(function ($controller, $rootScope) {
        scope = $rootScope.$new();
        ctrl = $controller('IndexController', {
            $scope: scope
        });
    }));

    it('should add name parameter to scope', function () {
        expect(scope.name).toBeDefined();
    });
});

Contents of controllers.js

var myApp = angular.module('myApp', []);

myApp.controller('IndexController', function ($scope) {
        $scope.name = 'bob';
});

Output of: jasmine-node test/ --junitreport

   Message:
     TypeError: object is not a function
   Stacktrace:
     TypeError: object is not a function
    at null.<anonymous> (/tmp/tests/test/unit/controllerSpec.js:38:16)
    at Object.<anonymous> (/tmp/tests/test/unit/controllerSpec.js:36:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
2

There are 2 best solutions below

0
On

Angular is made to run in the browser. It will not run in node. At least, not without a lot of effort.

There has been an attempt to port it to node, but that project is really intended to render angular pages server side for search engine optimization. Unless you have a really good reason, you shouldn't be trying to test Angular apps in Node.

0
On

beforeEach() taks in a function. Be sure module('myApp') and inject(...) are returning actual function definitions. Jasmine's beforeEach is like "call the passed function before each test", so you may want:

beforeEach( function(){ module('myApp') } );

I am unfamiliar with karma, but do use jasmine's done() method in my beforeEach() like this:

var valueForEachTest = null;
beforeEach( function(done) {
  doSomething( function(value){
    valueForEachTest = value;
    done();
  });
} );

Not using that done() call breaks my tests because I'm doing a few asynchronous call in there (perhaps Jasmine is not waiting for beforeEach to finish?).