requirejs - ¿Jasmine 2.0 realmente no funciona con require.js?
(2)
El nuevo boot.js hace un montón de la inicialización y lo adjunta a window.onload () que ya ha sido invocado por el tiempo require.js carga Jasmine. Puede llamar manualmente a window.onload () para inicializar HTML Reporter y ejecutar el entorno.
SpecRunner.html
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Jasmine Spec Runner v2.0.0</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-2.0.0/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-2.0.0/jasmine.css">
<!-- specRunner.js runs all of the tests -->
<script data-main="specRunner" src="../bower_components/requirejs/require.js"></script>
</head>
<body>
</body>
</html>
specRunner.js
(function() {
''use strict'';
// Configure RequireJS to shim Jasmine
require.config({
baseUrl: ''..'',
paths: {
''jasmine'': ''tests/lib/jasmine-2.0.0/jasmine'',
''jasmine-html'': ''tests/lib/jasmine-2.0.0/jasmine-html'',
''boot'': ''tests/lib/jasmine-2.0.0/boot''
},
shim: {
''jasmine'': {
exports: ''window.jasmineRequire''
},
''jasmine-html'': {
deps: [''jasmine''],
exports: ''window.jasmineRequire''
},
''boot'': {
deps: [''jasmine'', ''jasmine-html''],
exports: ''window.jasmineRequire''
}
}
});
// Define all of your specs here. These are RequireJS modules.
var specs = [
''tests/spec/routerSpec''
];
// Load Jasmine - This will still create all of the normal Jasmine browser globals unless `boot.js` is re-written to use the
// AMD or UMD specs. `boot.js` will do a bunch of configuration and attach it''s initializers to `window.onload()`. Because
// we are using RequireJS `window.onload()` has already been triggered so we have to manually call it again. This will
// initialize the HTML Reporter and execute the environment.
require([''boot''], function () {
// Load the specs
require(specs, function () {
// Initialize the HTML Reporter and execute the environment (setup by `boot.js`)
window.onload();
});
});
})();
Ejemplo de especificación
define([''router''], function(router) {
''use strict'';
describe(''router'', function() {
it(''should have routes defined'', function() {
router.config({});
expect(router.routes).toBeTruthy();
});
});
});
Estoy configurando mi SpecRunner.html / .js, RequireConfig.js, mis caminos y mis calces al igual que lo hice con los candidatos de versiones anteriores de Jasmine + RequireJs, pero ahora mis métodos de prueba muestran a Jasmine sin definir. Recientemente cambiaron a un método diferente de cargar Jasmine que entiendo que es incompatible con RequireJs.
¿Mi entendimiento es correcto? Si es así, ¿podremos volver a utilizar Jasmine + RequireJs?
Este es un enfoque alternativo que puede ser más simple en algunos casos: use el soporte asíncrono de Jasmine para cargar su módulo AMD antes de ejecutar pruebas, como esto:
en MySpec.js :
describe(''A suite'', function() {
var myModule;
// Use require.js to fetch the module
it("should load the AMD module", function(done) {
require([''myModule''], function (loadedModule) {
myModule = loadedModule;
done();
});
});
//run tests that use the myModule object
it("can access the AMD module", function() {
expect(myModule.speak()).toBe("hello");
});
});
Para que esto funcione, deberá incluir require.js en su SpecRunner.html y, posiblemente, configurar require (como lo haría normalmente, por ejemplo, al establecer la baseUrl), como esto:
en SpecRunner.html :
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Jasmine Spec Runner v2.0.0</title>
<link rel="shortcut icon" type="image/png" href="lib/jasmine-2.0.0/jasmine_favicon.png">
<link rel="stylesheet" type="text/css" href="lib/jasmine-2.0.0/jasmine.css">
<script src="lib/require.min.js"></script>
<script> require.config({ baseUrl: "src" }); </script>
<script src="lib/jasmine-2.0.0/jasmine.js"></script>
<script src="lib/jasmine-2.0.0/jasmine-html.js"></script>
<script src="lib/jasmine-2.0.0/boot.js"></script>
<script src="spec/MySpec.js"></script>
</head>
<body>
</body>
</html>
Para este ejemplo, la implementación del módulo AMD podría ser algo como esto:
en src / myModule.js :
define([], function () {
return {
speak: function () {
return "hello";
}
};
});
Aquí hay un Plunk en funcionamiento que implementa este ejemplo completo .
¡Disfrutar!