SpecRunner for Jasmine+Require
I wanted to have jasmine tests for my code, but as I use Require, I had to deal with the fact that modules were loaded by Require AFTER Jasmine ran, so no test would pass.
Finally managed to fix the issue by following a couple of guidelines :
Extract require.config.js
I have some shims/paths for require and I wanted to keep DRY, so I extracted my Require config in a separate file and load it right after require.js :
requirejs.config({
baseUrl: "some/path",
paths: {
'backbone': 'lib/backbone',
'jquery': 'lib/jquery',
'underscore': 'lib/underscore'
},
shim: {
'backbone': {
deps: ['jquery', 'underscore'],
exports: 'Backbone'
},
'jquery': {
exports: '$'
},
'underscore': {
exports: '_'
}
}
});
Wrap spec files into modules
Also necessary, have each spec wrapped into a define() call :
define("truth_spec", [], function() {
describe("truth", function truth_spec() {
it("should be true", function() {
expect(true).toBe(true);
});
});
});
Have a specrunner
And finally, specrunner.js, that will run modules where the name ends by "_spec" :
require(["underscore"], function(_) {
var specs = _.filter(require.s.contexts._.registry, function(mod) {
// trick to check if ends with "_spec"
return mod.map.name.slice(-5) === "_spec";
});
specs = _.map(specs, function(mod) {
return mod.map.name;
});
require(specs, function() {
jasmine.getEnv().execute();
});
});
Et voilà !
Written by Emmanuel Bourgerie
Related protips
Have a fresh tip? Share with Coderwall community!
JavaScript on a page runs with the privileges of that origin. One altered library, tag manager, or snippet can read inputs, change what people see, and call your APIs as the user.
Security insights from Cside