Les tests avec le Karma et RequireJS avec les fichiers de CommonJS syntaxe
Je suis en train de travailler sur un angulaires application qui est écrit dans CommonJS syntaxe et utilise un grognement tâche grunt-contrib-requirejs tâche de traduire les fichiers source pour AMD format et les compiler dans un seul fichier de sortie. Mon but est de faire le Karma de travail avec RequireJS et de garder mes fichiers source et les fichiers de spec dans CommonJS syntaxe.
J'ai été en mesure d'obtenir un test simple en passant AMD format avec la structure suivante:
-- karma-test
|-- spec
| `-- exampleSpec.js
|-- src
| `-- example.js
|-- karma.conf.js
`-- test-main.js
et les fichiers suivants:
karma.conf.js
//base path, that will be used to resolve files and exclude
basePath = '';
//list of files /patterns to load in the browser
files = [
JASMINE,
JASMINE_ADAPTER,
REQUIRE,
REQUIRE_ADAPTER,
'test-main.js',
{pattern: 'src/*.js', included: false},
{pattern: 'spec/*.js', included: false}
];
//list of files to exclude
exclude = [];
//test results reporter to use
//possible values: 'dots', 'progress', 'junit'
reporters = ['progress'];
//web server port
port = 9876;
//cli runner port
runnerPort = 9100;
//enable /disable colors in the output (reporters and logs)
colors = true;
//level of logging
//possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel = LOG_DEBUG;
//enable /disable watching file and executing tests whenever any file changes
autoWatch = true;
//Start these browsers, currently available:
browsers = ['Chrome'];
//If browser does not capture in given timeout [ms], kill it
captureTimeout = 60000;
//Continuous Integration mode
//if true, it capture browsers, run tests and exit
singleRun = false;
example.js
define('example', function() {
var message = "Hello!";
return {
message: message
};
});
exampleSpec.js
define(['example'], function(example) {
describe("Example", function() {
it("should have a message equal to 'Hello!'", function() {
expect(example.message).toBe('Hello!');
});
});
});
test-main.js
var tests = Object.keys(window.__karma__.files).filter(function (file) {
return /Spec\.js$/.test(file);
});
requirejs.config({
//Karma serves files from '/base'
baseUrl: '/base/src',
//Translate CommonJS to AMD
cjsTranslate: true,
//ask Require.js to load these files (all our tests)
deps: tests,
//start test run, once Require.js is done
callback: window.__karma__.start
});
Cependant, mon but est d'écrire à la fois le fichier source et le fichier de spec dans CommonJS syntaxe avec les mêmes résultats, comme suit:
example.js
var message = "Hello!";
module.exports = {
message: message
};
exampleSpec.js
var example = require('example');
describe("Example", function() {
it("should have a message equal to 'Hello!'", function() {
expect(example.message).toBe('Hello!');
});
});
Mais, en dépit de la cjsTranslate
indicateur a la valeur true
, je viens de recevoir ce message d'erreur:
Uncaught Error: Module name "example" has not been loaded yet for context: _. Use require([])
http://requirejs.org/docs/errors.html#notloaded
at http://localhost:9876/adapter/lib/require.js?1371450058000:1746
Toutes les idées sur la façon dont ceci peut être accompli?
Edit: j'ai trouvé cette question de karma, le coureur repo: https://github.com/karma-runner/karma/issues/552 et il y a quelques commentaires qui peut aider avec ce problème, mais je n'ai pas eu de chance avec eux jusqu'à présent.
OriginalL'auteur ekweible | 2013-06-24
Vous devez vous connecter pour publier un commentaire.
La solution que j'ai fini par trouver impliqués à l'aide de grunt et écrit quelques tâches grunt. Le processus va comme ceci:
Créer un grognement tâche de construire un bootstrap requirejs fichier en trouvant toutes les spécifications à l'aide d'un modèle de fichier, boucle à travers eux et la construction d'un traditionnel AMD style exiger bloc et la création d'un fichier temporaire avec un code comme ceci:
Créer un RequireJS grunt tâche qui compile les au-dessus de fichier d'amorçage et de sorties d'un seul fichier js qui aura pour effet d'inclure tout le code source, les spécifications, et les bibliothèques.
Créer un grognement tâche manuellement commence un karma de serveur et de servir le seul compilé fichier js que nous avons maintenant pour les tests.
En outre, j'ai été en mesure d'abandonner le
REQUIRE_ADAPTER
dans lekarma.conf.js
fichier et ensuite seulement inclure le seul compilé fichier js au lieu de la structure correspondant à l'ensemble du code source et de spécifications, de sorte qu'il ressemble à ceci maintenant:Dans le grognement de la tâche de configuration pour le requirejs compilation, il était également nécessaire d'utiliser amande afin de commencer l'exécution du test (test d'exécution accrocher sans elle). Vous pouvez voir cela dans la requirejs grunt tâche config ci-dessus.
OriginalL'auteur ekweible
Il ya un couple de choses. Tout d'abord: j'ai peut-être oublié quelques détails à votre question (car il est super énorme) - désolé.
En bref, vous souhaitez peut-être à la caisse épine Dorsale Standard
wip
direction générale organisation des tests: https://github.com/backbone-boilerplate/backbone-boilerplate/tree/wipPremière: RequireJS ne prend pas en charge déballé raw common.js le module.
cjsTranslate
est un R. js (l'outil de génération) option pour convertir Commonjs pour AMD compatible lors de la construction. Ainsi, nécessitant une CJS raw module ne fonctionne pas. Pour résoudre ce problème, vous pouvez utiliser un serveur pour filtrer les scripts envoyés et de les compiler pour AMD format. Sur BBB, nous passons de fichier par le biais d'un statique servir à compiler:Deuxième: Le Karma requirejs plugin ne fonctionne pas super bien et il est assez facile à utiliser requireJS directement. Sur BBB, c'est comment nous avons réussi: https://github.com/backbone-boilerplate/backbone-boilerplate/blob/wip/test/jasmine/test-runner.js#L16-L36
Espérons que cette aide!
OriginalL'auteur Simon Boudrias