37 votes

Pourquoi est-ce que je vois "définir non défini" lors de l'exécution d'un test Mocha avec RequireJS?

Je suis en train d'essayer de comprendre comment élaborer autonome de code Javascript. Je veux écrire Javascript code avec des tests et des modules, l'exécution de la ligne de commande. J'ai donc installé node.js et npm avec les bibliothèques requirejs, underscore, et mocha.

Mon répertoire de la structure ressemble à ceci:

> tree .
.
├── node_modules
├── src
│   └── utils.js
└── test
    └── utils.js

src/utils.js est un petit module que je suis en train d'écrire, avec le code suivant:

> cat src/utils.js 
define(['underscore'], function () {

    "use strict";

    if ('function' !== typeof Object.beget) {
        Object.beget = function (o) {
            var f = function () {
            };
            f.prototype = o;
            return new f();
        };
    }

});

et test/utils.js est le test:

> cat test/utils.js 
var requirejs = require('requirejs');
requirejs.config({nodeRequire: require});

requirejs(['../src/utils'], function(utils) {

    suite('utils', function() {
        test('should always work', function() {
            assert.equal(1, 1);
        })
    })

});

que j'ai ensuite essayer de l'exécuter à partir du haut niveau de répertoire ( mocha voit l' test directory):

> mocha

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Calling node's require("../src/utils") failed with error: ReferenceError: define is not defined
    at /.../node_modules/requirejs/bin/r.js:2276:27
    at Function.execCb (/.../node_modules/requirejs/bin/r.js:1872:25)
    at execManager (/.../node_modules/requirejs/bin/r.js:541:31)
    ...

Donc mes questions sont:

  • Est-ce la bonne façon de structurer le code?
  • Pourquoi mon test ne fonctionne pas?
  • Quelle est la meilleure façon d'apprendre ce genre de chose? Je vais avoir un moment difficile de trouver de bons exemples avec Google.

Merci...

[désolé - momentanément résultats publiés à partir d'un code erroné; fixe maintenant]

PS je suis à l'aide de requirejs parce que je tiens aussi à exécuter ce code (ou certains) à partir d'un navigateur, plus tard.

Mise À Jour / Solution

Quelque chose qui n'est pas dans les réponses ci-dessous, c'est que j'avais besoin d'utiliser mocha -u tdd pour le test de style ci-dessus. Voici le test final (ce qui requiert également l'affirmer) et de son utilisation:

> cat test/utils.js 

var requirejs = require('requirejs');
requirejs.config({nodeRequire: require});

requirejs(['../src/utils', 'assert'], function(utils, assert) {

    suite('utils', function() {
        test('should always work', function() {
            assert.equal(1, 1);
        })
    })

});
> mocha -u tdd

  .

  ✔ 1 tests complete (1ms)

18voto

David Ellis Points 4278

La raison que votre test n'est pas en cours d'exécution est parce qu' src/utils.js n'est pas valide Node.js de la bibliothèque.

Selon le RequireJS de la documentation, afin de co-exister avec Node.js et le CommonJS exiger standard, vous devez ajouter un peu de passe-partout vers le haut de votre src/utils.js le fichier de sorte RequireJS de l' define fonction est chargé.

Cependant, depuis RequireJS a été conçu pour être en mesure d'exiger le "classique" navigateur web orientée vers le code source, j'ai tendance à utiliser le modèle suivant avec mon Node.js les bibliothèques que je veux aussi s'exécute dans le navigateur:

if(typeof require != 'undefined') {
    // Require server-side-specific modules
}

// Insert code here

if(typeof module != 'undefined') {
    module.exports = whateverImExporting;
}

Ceci a l'avantage de ne pas nécessiter une bibliothèque pour les autres Node.js les utilisateurs et fonctionne bien en général avec RequireJS sur le client.

Une fois que vous obtenez votre code s'exécute dans Node.js, vous pouvez commencer à faire des tests. Personnellement, je préfère encore expresso de plus de moka, même si son successeur framework de test.

5voto

mwilcox Points 2091

Le Moka documentation est manquant sur la façon de régler ce genre de choses, et c'est déroutant à la figure parce que de tous les tours de magie, il n'sous le capot.

J'ai trouvé la clé pour l'obtention du navigateur de fichiers à l'aide de require.js travailler à Moka en vertu de Nœud: Moka a avoir les fichiers ajoutés à ses suites avec addFile:

mocha.addFile('lib/tests/Main_spec_node');

Et deuxièmement, l'utilisation beforeEach avec l'option de rappel pour charger vos modules de manière asynchrone:

describe('Testing "Other"', function(done){
    var Other;
    beforeEach(function(done){
        requirejs(['lib/Other'], function(_File){
            Other = _File;
            done(); // #1 Other Suite will run after this is called
        });
    });

    describe('#1 Other Suite:', function(){
        it('Other.test', function(){
            chai.expect(Other.test).to.equal(true);
        });
    });
});

J'ai créé un fichier d'amorce sur la façon d'obtenir tout ce travail: https://github.com/clubajax/mocha-bootstrap

-1voto

Bill Points 9537

Je n'utilise pas d' requirejs donc je ne suis pas sûr de ce que la syntaxe ressemble, mais c'est ce que je fais pour exécuter du code à la fois au sein d' node et de la browser:

Pour les importations, de déterminer si nous sommes en cours d'exécution dans le nœud ou le navigateur:

var root =  typeof exports !== "undefined" && exports !== null ? exports : window;

Ensuite, nous pouvons prendre n'importe quelle correctement les dépendances (ils seront d'ores et déjà disponibles si dans le navigateur ou nous utilisons require):

var foo = root.foo;
if (!foo && (typeof require !== 'undefined')) {
    foo = require('./foo');
}

var Bar = function() {
    // do something with foo
}

Et puis de toute fonctionnalité qui doit être utilisé par d'autres fichiers, nous les exporter vers de racine:

root.bar = Bar;

Comme pour les exemples, GitHub est une grande source. Juste aller vérifier dans le code de votre bibliothèque préférée pour voir comment ils l'ont fait :) j'ai utilisé mocha pour tester une bibliothèque javascript qui peut être utilisée aussi bien dans le navigateur et le nœud. Le code est disponible sur https://github.com/bunkat/later.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X