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
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 () {});
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.
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');
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');
});