SpecRunner para Jasmine + Require

Eu queria ter testes de jasmine para meu código, mas como uso Require, tive que lidar com o fato de que os módulos foram carregados por Require APÓS a execução do Jasmine, portanto nenhum teste passaria.

Finalmente consegui corrigir o problema seguindo algumas diretrizes:

Extraia require.config.js

Tenho alguns shims / caminhos para require e queria manter DRY, então extraí minha configuração Require em um arquivo separado e carreguei logo após 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
: '_'
}
}
});

Envolva os arquivos de especificações em módulos

Também é necessário que cada especificação seja incluída em uma define()chamada:

define("truth_spec", [], function() {
describe
("truth", function truth_spec() {
it
("should be true", function() {
expect
(true).toBe(true);
});
});
});

Ter um specrunner

E, finalmente, specrunner.js, que executará módulos em que o nome termina com “_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à!