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