Jaka jest różnica między `before () ' a`beforeEach ()'?

Jaka konkretnie jest różnica między Mocha ' S before() i beforeEach()? (To samo pytanie dotyczy after() i afterEach().)

Zakładam, że before() uruchamia się raz na describe() Blok, A beforeEach() uruchamia się raz na test (it() blok). To prawda?

A kiedy wybrałbym użycie jednego nad drugim?

Author: ericsoco, 2014-01-28

1 answers

before() jest uruchamiany raz przed wszystkie testy w describe
after() jest uruchamiany raz po wszystkie testy w describe
beforeEach() jest uruchamiany przed każdym testem w describe
afterEach() jest uruchamiany po każdy test w describe

Który z nich chcesz użyć zależy od Twojego rzeczywistego testu.

Teraz, dla długiego wyjaśnienia. Jeśli uruchomisz mocha -R min na tym:
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");
    });
});

Zobaczysz coś takiego (pominąłem wyjście, które nie jest "istotne"): {]}

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

Rzeczą, która może być zaskakująca, jeśli spojrzysz na to, co wykonuje się przed i po każdym z testów na podpoziomie, jest to, że zarówno wywołania zwrotne na najwyższym poziomie, jak i na podpoziomie są wywoływane. To samo dotyczy afterEach.

Niektórzy są również zaskoczeni sekwencją sublevel before, top beforeEach, sublevel beforeEach. Uważają, że wszystkie Hooki w zewnętrznym zakresie powinny być wykonane przed wszystkimi hookami w wewnętrznym zakresie, więc oczekują sekwencji: top beforeEach, sublevel before, sublevel beforeEach. Jednak kolejność, w jakiej Mocha wykonuje Hooki, ma sens: hook before ma na celu ustawienie etapu dla grupy testów, podczas gdy test beforeEach jest dla każdego pojedynczego testu. Gdy Mocha wykonuje test, wszystkie before i beforeEach Hooki, które zostały ustawione w describe, który go Zawiera, i wszyscy przodkowie tego describe stosują się do testu. Mocha wykona każdy before hook z najbardziej wysuniętego zakresu do najbardziej wnętrza, a wszystkie beforeEach hook z najbardziej wysuniętego zakresu do najskrytsze. jednakże , wszystkie before Hooki, które zostaną zastosowane są wykonywane przed dowolnym beforeEach Hookiem. To wyjaśnia powyższą kolejność: sublevel before wykonuje przed top beforeEach, ponieważ jest to before hook. W przypadku after i afterEach stosuje się tę samą logikę, ale kolejność jest odwrócona: wszystkie zastosowane Hooki afterEach są wykonywane przed dowolnym Hookiem after.

Zauważ również, że Mocha nie dba o to, jak zamówiłem Moje połączenia it w stosunku do połączenia describe na najwyższym poziomie describe. Wykonuje top test1, top test2 i potem testy podpoziomowe, mimo że rozkaz, który dałem, był top test1, potem testy podpoziomowe, a następnie top test2.

Co chcesz wykorzystać wśród before, beforeEach, itd. naprawdę zależy od specyfiki Twoich testów. Jeśli chcesz skonfigurować obiekt lub strukturę danych, a ten obiekt lub struktura może być ponownie użyty przez wszystkie testy w jednymdescribe, możesz użyć before, aby go skonfigurować i after, aby go zburzyć. Może tak być, jeśli wykonujesz testy tylko do odczytu na struktura. Jeśli wszystkie testy tylko go odczytują, nie ma potrzeby tworzenia go w kółko. Jeśli każdy test w describe potrzebuje nowej kopii struktury, ponieważ każdy test jestmodyfikujący strukturę, powinieneś użyć beforeEach, aby utworzyć strukturę na nowo dla każdego testu, a następnie afterEach, jeśli chcesz ją całkowicie zburzyć. Zapewnia to izolację testu: każdy test rozpoczyna się od znanego stanu i nie zależy od obecności lub braku poprzedniego testu do / align = "left" /

 193
Author: Louis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-06 22:46:45