Deadly combination: Karma + RequireJS + Jasmine + Ace
This caused some troubles for me, so I am sharing it -- to save someone else's precious time. Of course, solving problems is always rewarding in experience :)
Scenario
I want to write a JavaScript module, which would be using Ace Editor. I decide to do it using TDD, together with all the tools of modern web developer: npm, Bower, RequireJS, Karma Test Runner, Jasmine testing framework and either Grunt or Gulp (haven't got to that part). I started by simple package installation:
bower install ace
Added everything it to my test-main.js
(which I created through karma init wizard):
require.config({
...
paths: {
jquery: 'lib/jquery/dist/jquery.min',
ace: 'lib/ace/lib/ace'
},
...
});
Note: lib
is my directory for files installed by Bower, you can set it by creating .bowerrc
file in root folder and adding simple line:
{
"directory" : "lib"
}
The Problem
When all is set, we launch karma start which produces funny errors such as:
WARN [web-server]: 404: /base/assert.js
PhantomJS 1.9.7 (Linux) ERROR: 'There is no timestamp for /base/assert.js!'
PhantomJS 1.9.7 (Linux) ERROR
Error: Module name "fs" has not been loaded yet for context: _. Use require([])
http://requirejs.org/docs/errors.html#notloaded
at /home/matas/code/tmp/karma-test/node_modules/requirejs/require.js:141
If we uninstall Ace using Bower, the error is gone, so it is clearly connected with it.
Solution
The root of problem is in automatically generated file test-main.js
It contains such matching pattern:
var TEST_REGEXP = /(spec|test)\.js$/i;
That test.js
is matched in Ace's test folder and included in testing - then the whole hell breaks loose :) Replace this line with something more specific to your project and make sure it does not match files in your libraries:
var TEST_REGEXP = /spec\.js$/i;
Happy coding :)