Quelle est précisément la différence entre le before()
de de Mocha et le beforeEach()
? (Même question pour after()
et afterEach()
.)
Je suppose que before()
est exécuté une fois par bloc describe()
, et que beforeEach()
est exécuté une fois par test (bloc it()
). Est-ce vrai?
Et quand choisirais-je d'utiliser l'un plutôt que l'autre?
before()
est exécuté une fois avant tous les tests dans un describe
after()
est exécuté une fois après tous les tests dans un describe
beforeEach()
est exécuté avant each test dans un describe
afterEach()
est exécuté après each test dans un describe
Celui que vous voulez utiliser dépend de votre test réel.
Maintenant, pour la longue explication. Si vous exécutez mocha -R min
sur ce:
describe("top", function () {
before(function () {
console.log("top before");
});
after(function () {
console.log("top after");
});
beforeEach(function () {
console.log("top beforeEach");
});
afterEach(function () {
console.log("top afterEach");
});
it("test1", function () {
console.log("top test1");
});
describe("sublevel", function() {
before(function () {
console.log("sublevel before");
});
after(function () {
console.log("sublevel after");
});
beforeEach(function () {
console.log("sublevel beforeEach");
});
afterEach(function () {
console.log("sublevel afterEach");
});
it("test1", function () {
console.log("sublevel test1");
});
it("test2", function () {
console.log("sublevel test2");
});
});
it("test2", function () {
console.log("top test2");
});
});
Vous verrez quelque chose comme (j'ai omis la sortie qui n'est pas pertinente):
top before
top beforeEach
top test1
top afterEach
top beforeEach
top test2
top afterEach
sublevel before
top beforeEach
sublevel beforeEach
sublevel test1
sublevel afterEach
top afterEach
top beforeEach
sublevel beforeEach
sublevel test2
sublevel afterEach
top afterEach
sublevel after
top after
Ce qui peut surprendre si vous regardez ce qui s’exécute avant et après chacun des tests du sous-niveau, c’est que les deux les callbacks beforeEach
au niveau supérieur et au niveau inférieur sont appelés . Même chose pour le afterEach
.
Certains sont également surpris par la séquence sublevel before
, top beforeEach
, sublevel beforeEach
. Ils pensent que tous les crochets d'une portée externe doivent s'exécuter avant tous les crochets d'une portée interne, ils attendent donc la séquence: top beforeEach
, sublevel before
, sublevel beforeEach
. Cependant, l'ordre dans lequel Mocha exécute les hooks est tout à fait logique: un hook before
sert de base à un groupe de tests, alors qu'un test beforeEach
correspond à chaque test. Lorsque Mocha exécute un test, tous les hooks before
et beforeEach
définis dans le describe
qui le contient, ainsi que tous les ancêtres de ce describe
appliquer à l'épreuve. Mocha exécutera chaque before
hook de la portée la plus externe vers la plus interne, et tous les beforeEach
hook de la portée la plus externe vers la plus intérieure. Cependant, tous les hooks before
qui s'appliquent sont exécutés avant tout hook beforeEach
. Ceci explique l'ordre ci-dessus: sublevel before
s'exécute avant top beforeEach
parce qu’il s’agit d’un hook before
. Et avec after
et afterEach
, la même logique s'applique, mais l'ordre est inversé: tous les hooks afterEach
qui s'appliquent sont exécutés avant tout hook after
.
Notez également que Mocha ne se soucie pas de la façon dont j'ai commandé mes appels it
par rapport à l'appel describe
dans le niveau supérieur describe
. Il exécute top test1
, top test2
et alors les tests de sous-niveau, même si l'ordre que j'ai donné était top test1
, puis les tests de sous-niveau, puis top test2
.
Ce que vous voulez utiliser parmi before
, beforeEach
, etc. dépend vraiment des spécificités de vos tests. Si vous devez configurer un objet fictif ou une structure de données et que cet objet ou cette structure can soit réutilisé par tous les tests d'un seul describe
, vous pouvez utiliser before
pour configurez-le et after
pour le démolir. Cela pourrait être le cas si vous effectuez des tests en lecture seule sur la structure. Si tous vos tests ne font que le lire, il n’est pas nécessaire de le créer encore et encore. Si chaque test de votre describe
nécessite une nouvelle copie de la structure car chaque test est modification la structure, vous devez alors utiliser beforeEach
pour Créez à nouveau la structure pour chaque test, puis afterEach
si vous devez le détruire proprement. Cela garantit l'isolation du test: chaque test commence à partir d'un état connu et ne dépend pas de la présence ou de l'absence d'un test précédent pour réussir.