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à!