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?
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 uruchomiszmocha -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" /
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