web-dev-qa-db-fra.com

rejoindre des tests de plusieurs fichiers avec mocha.js

J'essaie de joindre tous les tests de plusieurs fichiers dans un seul fichier, quelque chose comme ceci:

  describe('Controllers', function() {
    describe('messages.js', function() {
      require('./controllertests/messages').test(options);
    })
    describe('users.js', function() {
      require('./controllertests/users').test(options);
    })
  })

Je suis à peu près sûr que ce n'est pas la meilleure façon de participer à des tests, j'ai du mal à trouver des exemples pour y parvenir: s

77
coiso

Si vous souhaitez inclure plusieurs modules dans votre hiérarchie describe, comme vous le faites dans votre question, vous faites en gros ce que vous faites il , sauf si vous souhaitez écrire un programme de test personnalisé pour Mocha. Écrire le chargeur personnalisé ne serait pas plus simple et ne rendrait pas votre code plus clair que ce que vous avez déjà.

Voici un exemple de la façon dont je changerais quelques choses. Le sous-répertoire test de cet exemple est organisé comme suit:

.
└── test
    ├── a
    │   └── a.js
    ├── b
    │   └── b.js
    ├── common.js
    └── top.js

top.js:

function importTest(name, path) {
    describe(name, function () {
        require(path);
    });
}

var common = require("./common");

describe("top", function () {
    beforeEach(function () {
       console.log("running something before each test");
    });
    importTest("a", './a/a');
    importTest("b", './b/b');
    after(function () {
        console.log("after all tests");
    });
});

La fonction importTest montre simplement comment il serait possible de gérer la répétition de l'importation de plusieurs modules sans avoir à ressaisir l'intégralité de describe(... require... chose à chaque fois. Le module common est destiné à contenir ce que vous devez utiliser dans plusieurs modules de la suite de tests. En fait, je ne l'utilise pas dans top mais il pourrait être utilisé là-bas, si nécessaire.

Je noterai ici que le beforeEach exécutera son code avant chaque test enregistré auprès de it, qu'il apparaisse dans le describe dans top ou qu'ils apparaissent dans l'un des modules importés . Avec --recursive, le code beforeEach devrait être copié dans chaque module ou vous auriez peut-être un hook beforeEach dans chaque module qui appelle une fonction importée d'un module commun.

De plus, le hook after fonctionnera après tous tests dans la suite. Cela ne peut pas être répliqué avec --recursive. Si tu utilises --recursive et ajoutez le code after à chaque module, il sera exécuté une fois par module plutôt qu’une seule fois pour le test entier .

L'affichage de tous les tests sous un seul en-tête top ne peut pas être répliqué à l'aide de --recursive. Avec --recursive chaque fichier pourrait avoir describe("top" mais cela créerait un nouvel en-tête top pour chaque fichier.

common.js:

var chai = require("chai");

var options = {
    foo: "foo"
};

exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;

Utiliser un module nommé common comme ceci est quelque chose que j'ai déjà fait dans certaines de mes suites de tests pour éviter d'avoir à require _ un tas de choses encore et encore et pour conserver des variables ou des fonctions globales en lecture seule qui ne conservent pas leur état. Je préfère ne pas polluer l'objet global comme dans la réponse de thgaskell car cet objet est véritablement global et accessible même dans les bibliothèques tierces que votre code est peut-être en train de charger. Ce n'est pas quelque chose que je trouve acceptable dans mon code.

a/a.js:

var common = require("../common");
var options = common.options;
var assert = common.assert;

it("blah a", function () {
    console.log(options.foo);
    assert.isTrue(false);
});

b/b.js:

it("blah b", function () {});
96
Louis

Bien que cela puisse ne pas être directement lié à la question, la réponse que je cherchais était:

$ mocha --recursive

Tous les tests seront exécutés dans les sous-répertoires du dossier "test". Soigné. Cela évite de devoir gérer une liste de tests que je veux charger et de toujours tout exécuter.

25
Ian Jamieson

Rien ne vous empêche d'exécuter plusieurs fichiers de test. En règle générale, chaque test ne doit pas dépendre des résultats d'un autre test. Par conséquent, le partage de variables n'est pas quelque chose que vous voudriez faire.

Voici un exemple de la manière dont vous pourriez organiser vos fichiers de test.

.
├── app.js
└── test
    ├── common.js
    ├── mocha.opts
    │
    ├── controllers
    │   ├── messages-controller.js
    │   └── users-controller.js
    │
    └── modles
        ├── messages-model.js
        └── users-model.js

Puis à l'intérieur de votre mocha.opts fichier, assurez-vous de définir le fichier --recursive option.

mocha.opts

--ui bdd
--recursive

S'il existe des modules communs que vous souhaitez inclure dans tous les fichiers, vous pouvez les ajouter à la common.js fichier. Les fichiers situés à la racine du répertoire test seront exécutés avant les fichiers des répertoires imbriqués.

common.js

global.chai = require('chai');
global.assert = chai.assert;
global.expect = chai.expect;
chai.should();
chai.config.includeStack = true;

process.env.NODE_ENV = 'test';

// Include common modules from your application that will be used among multiple test suites.
global.myModule = require('../app/myModule');
14
thgaskell

Je sais que c’est un vieux billet, mais j’ai voulu préciser ce qui m’a été une bonne solution, très similaire à la méthode proposée par OP.

Le projet sur lequel je travaille est bien testé et les tests ne cessent de croître. J'ai fini par utiliser require car il est synchrone et facilite donc la composition de vos tests sans trop de changement d'architecture:

// inside test/index.js

describe('V1 ROUTES', () => {
  require('./controllers/claims.test');
  require('./controllers/claimDocuments.test');
  require('./controllers/claimPhotos.test');
  require('./controllers/inspections.test');
  require('./controllers/inspectionPhotos.test');
  require('./controllers/versions.test');
  require('./services/login.v1.test');
});

describe('V2 ROUTES', () => {
  require('./services/login.v2.test');
  require('./services/dec-image.v2.test');
});

describe('V3 ROUTES', () => {
  require('./services/login.v3.test');
  require('./services/getInspectionPhotosv3.test');
  require('./services/getPolicyInfo.v3.test');
});

describe('ACTIONS', () => {
  require('./actions/notifications.test');
});
4
Mike Fleming