Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper use of karma-commonjs with Jasmine 2

I've spent a fair amount of time trying to debug this, and figured I would ask. I even created a GitHub repository but won't rely on it, so here goes. I'm trying to take advantage of CommonJS syntax within the Karma test runner using PhantomJS. For my module I created the simplest thing I could think of:

exports.returnYes = function() {
  return "Yes";
};

The Jasmine test is:

var returnYes = require("../js/returnYes").returnYes;

describe("returnYes", function() {

  it("should return Yes", function() {
    expect(returnYes()).toBe("Yes");
  });

});

And, if I do a jasmine init I can run it from the command line thanks to jasmine-npm by simply typing jasmine with output:

$ jasmine
Started
.


1 spec, 0 failures
Finished in 0.003 seconds

Now to try and get it to work inside karma: I create my karma.conf.js with frameworks: jasmine,commonjs. And, I add commonjs as preprocessor.

I try to do a karma run and I find that it can't find global which is part of getJasmineRequireObj in jasmine.js where it declares jasmineGlobal = global;

The command line output is a little hard to read, but here it is:

$ karma run
[2015-06-27 17:41:35.266] [DEBUG] config - Loading config /Users/zen/Projects/karma-commonjs-test/karma.conf.js
##teamcity[enteredTheMatrix]
##teamcity[testSuiteStarted nodeId='1' parentNodeId='0' name='karma.conf.js' nodeType='config' locationHint='config:///Users/zen/Projects/karma-commonjs-test/karma.conf.js']
##teamcity[testSuiteStarted nodeId='2' parentNodeId='1' name='PhantomJS 1.9.8 (Mac OS X 0.0.0)' nodeType='browser']
##teamcity[testStarted nodeId='3' parentNodeId='2' name='Error' nodeType='browserError']
##teamcity[testFailed nodeId='3' error='yes' message='ReferenceError: Can|'t find variable: global|nat http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js?68f13ab3f93af5a219b9fe8409f8763b31998bba:27']
##teamcity[testSuiteFinished nodeId='2']
##teamcity[testSuiteFinished nodeId='1']

For good measure here are the devDependencies in my packages.json:

"devDependencies": {
  "jasmine-core": "^2.3.4",
  "karma": "^0.12.37",
  "karma-commonjs": "0.0.13",
  "karma-jasmine": "^0.3.5",
  "karma-phantomjs-launcher": "^0.2.0",
  "phantomjs": "^1.9.17"
}

I'm not sure why I can't find global. Any help would be greatly appreciated!!! :)

like image 221
zen Avatar asked Jun 27 '15 22:06

zen


People also ask

What is singleRun in karma?

The property singleRun controls how Karma executes, if set to true , Karma will start, launch configured browsers, run tests and then exit with a code of either 0 or 1 depending on whether or not all tests passed.

How do I use karma conf in JavaScript?

Overview. In order to serve you well, Karma needs to know about your project in order to test it and this is done via a configuration file. The easiest way to generate an initial configuration file is by using the karma init command. This page lists all of the available configuration options.


1 Answers

It seems like my whole problem came down to the line in karma.conf.js (not shown in my original question:

preprocessors: {
  '**/*.js': ['commonjs']
},

For some reason, jasmine.js is not happy being pre-processed by commonjs, and "**/*.js" says to go through all subdirectories (which is probably overkill), including node_modules which has jasmine-core/jasmine.js

So I can either make my pre-processor more specific (best practice):

preprocessors: {
  'spec/*.js': ['commonjs'],
  'js/*.js': ['commonjs']
},

but as a test to see if any other files would give me a problem, I tried:

preprocessors: {
  '**/!(jasmine).js': ['commonjs'],
},

And, everything worked as well. Bottom line. Do not process jasmine.js through commonjs preprocessor!

like image 51
zen Avatar answered Sep 29 '22 07:09

zen