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 de la façon de procéder: s
node.js
unit-testing
mocha
coiso
la source
la source
.only()
celui-ci, il peut être utile de pouvoirdescribe.only()
continuer à exécuter tout un répertoire de tests. C'est ce qui m'a amené ici.Réponses:
Si vous souhaitez inclure plusieurs modules dans votre
describe
hiérarchie comme vous le faites dans votre question, ce que vous faites est à peu près tout , à moins que vous ne souhaitiez écrire un chargeur de test personnalisé pour Mocha. L'écriture du chargeur personnalisé ne serait pas plus facile ni ne rendrait votre code plus clair que ce que vous avez déjà.Voici un exemple de la façon dont je changerais certaines choses. le
test
sous-répertoire de cet exemple est organisé comme suit: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
importTest
fonction est juste de montrer comment il serait possible de gérer la répétition de l'importation de plusieurs modules sans avoir à retaper l'ensembledescribe(... require...
à chaque fois. Lecommon
module est destiné à contenir ce que vous devez utiliser dans plusieurs modules de la suite de tests. Je ne l'utilise pas réellementtop
mais il pourrait être utilisé là-bas, si nécessaire.Je noterai ici que le
beforeEach
exécutera son code avant chaque test enregistré avecit
s'ils apparaissent à l'intérieur dudescribe
intop
ou dans l' un des modules importés . Avec--recursive
, lebeforeEach
code devrait être copié dans chaque module ou peut-être auriez-vous unbeforeEach
hook dans chaque module qui appelle une fonction importée d'un module commun.De plus, le
after
hook s'exécutera après tous les tests de la suite. Cela ne peut pas être répliqué avec--recursive
. Si vous utilisez--recursive
et ajoutez le code deafter
à chaque module, il sera exécuté une fois par module plutôt qu'une seule fois pour tout le test.L'affichage de tous les tests sous un seul en-
top
tête ne peut pas être répliqué à l'aide de--recursive
. Avec--recursive
chaque fichier pourrait avoirdescribe("top"
mais cela créerait un nouveautop
titre pour chaque fichier.common.js
:var chai = require("chai"); var options = { foo: "foo" }; exports.options = options; exports.chai = chai; exports.assert = chai.assert;
L'utilisation d'un module nommé
common
comme celui-ci est quelque chose que j'ai fait dans certaines de mes suites de tests pour éviter d'avoir à fairerequire
un tas de choses encore et encore et pour contenir des variables globales en lecture seule ou des fonctions qui ne conservent pas l'état. Je préfère ne pas polluer leglobal
objet comme dans la réponse de thgaskell car cet objet est vraiment global et accessible même dans les bibliothèques tierces que votre code peut 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 () {});
la source
global
portée, je l'utilise pour les bibliothèques d'assertions afin de garder les fichiers de test plus propres. Ce n'est pas comme si vous écrasiezglobal.process
. Les variables locales remplaceront àglobal
moins que d'autres bibliothèques n'appellent explicitementglobal.XYZ
ce qui est peu probable. Cela ne dure que pendant la durée des tests. Cela ne m'a pas encore fait mal, mais je vous ferai savoir le moment où ça me mord dans le cul :)importTest
et appelerrequire('path')()
par exemple?importTest
fonction n'est qu'une fonction pratique. L'important, c'est d'envelopper l'require
appel dans undescribe
bloc. Il est important que l'require
appel soit encapsulé,describe
sinon les modules ne seront pas isolés dans leur propre bloc et tout hook défini par le fichier importé sera défini sur le mauvais bloc. Si aimportTest
été remplacé par un appel direct àrequire
sans emballagedescribe
, les modulesa/a
etb/b
partageraient des crochets. Par exemple, unbeforeEach
hook défini dansb/b
serait également exécuté avant chaque test dansa/a
.Bien que cela ne soit pas directement lié à la question, la réponse que je recherchais était:
Exécutera tous les tests dans les sous-répertoires du dossier "test". Soigné. Évite d'avoir à maintenir une liste de tests que je veux charger et de toujours tout exécuter.
la source
describe
blocs, lesdescribe
blocs qui couvrent les fichiers--recursive
ne le feront pas. Vu que cela ne résout pas le problème de l'OP, je ne l'appellerais pas «meilleur».describe
blocsdescribe
bloc. Regardez la question. Ledescribe
bloc "Contrôleurs" doit englober les tests de./controllertests/messages.js
et./controllertests/users.js
. Gifler--recursive
sur une invocation de Mocha ne crée pas comme par magie undescribe("Controllers"
bloc.describe
blocs par magie - ce que j'ai appris à faire de Dumbledore lui-même.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, donc partager des 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.
Ensuite, à l'intérieur de votre
mocha.opts
fichier, assurez-vous de définir l'--recursive
option.moka.opts
S'il y a des modules communs que vous souhaitez inclure dans tous les fichiers, vous pouvez l' ajouter au
common.js
fichier. Les fichiers à la racine dutest
répertoire seront exécutés avant les fichiers dans les 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');
la source
describe('mytest', function() { /* ..... etc */ });
Je sais que c'est un ancien post mais je voulais faire écho à ce qui a été une bonne solution pour moi, 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 donc facilite un peu 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'); });
la source
J'ai eu un problème similaire où j'avais un tas de tests pour des classes de la même catégorie et je voulais les regrouper pour faciliter leur visualisation dans un IDE. Tous mes tests et mon code utilisaient déjà des modules ES6 - je ne voulais pas tous les réécrire pour les utiliser
require
comme je l'ai vu dans d'autres exemples.Je l'ai résolu en
describe
exportant mon «regroupement» , puis en l'important dans mes fichiers de test et en les ajoutant par programme à l'importationdescribe
. J'ai fini par créer une méthode d'aide pour faire abstraction de toute la plomberie.Dans someCategory.spec.js
const someCategory= describe("someCategory", () => {}); // Use this just like a regular `describe` to create a child of this scope in another file export default function describeMember(skillName, testFn) { return describe(skillName, function configureContext() { // Make context a child of `someCategory` context function Context() {} Context.prototype = someCategory.ctx; this.ctx = new Context(); // Re-parent the suite created by `describe` above (defaults to root scope of file it was created in) this.parent.suites.pop(); someCategory.addSuite(this); // Invoke the fn now that we've properly set up the parent/context testFn.call(this); }); }
Dans les tests individuels:
import { default as describeCategoryMember } from './someCategory.spec'; describeCategoryMember('something', () => { describe('somethingElse', () => { ... }); it('a test', () => { ... }); })
la source
describe( 'Running automation test, Please wait for all test to complete!'.red, function () { var run = require( './Test.js' ); for ( var i = 0; i < 2; i++ ) { run.badLogin(); run.loginLimited(); run.acceptJob(); run.drivingToJob(); run.arrivedAtJob(); run.towingJob(); run.arrivedDestination(); run.jobComplete(); run.restrictionLicensePlate(); run.newNodeMainMenu(); run.newNodeMainMenuToDrafts(); run.draftDelete(); run.resetAllData(); run.companyVehicle(); run.actionsScreenClockInOut(); run.mainMenuLogout(); run.loginAdmin(); run.actionsScreenLogout(); } } );
la source
./Test.js
? Qui sait? Pour mémoire, je suis actuellement le premier répondant dans la balise moka . Je connais Mocha de fond en comble, mais je ne peux pas comprendre cette réponse.