web-dev-qa-db-fra.com

Quelle est la difference entre `before ()` et `beforeEach ()`?

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?

74
ericsoco

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.

158
Louis