before()
jest uruchamiany jeden raz przed wykonaniem wszystkich testów w a, describe
after()
jeden raz po wykonaniu wszystkich testów w a, describe
beforeEach()
przed każdym testem w a, describe
afterEach()
po każdym teście w adescribe
Który z nich chcesz użyć, zależy od twojego rzeczywistego testu.
Teraz długie wyjaśnienie. 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 dane wyjściowe, które nie są 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
Tym, co może być zaskakujące, jeśli spojrzeć na to, co wykonuje przed i po każdym z testów w podpoziomu jest to, że oba te beforeEach
wywołania zwrotne na poziomie górnym i na podpoziomu są nazywane. To samo dotyczy afterEach
.
Niektóre z nich są również zaskoczony przez sekwencję sublevel before
, top beforeEach
, sublevel beforeEach
. Myślą, że wszystkie haki w zakresie zewnętrznej należy wykonać przed wszystkimi hakami w zakresie wewnętrznym, więc spodziewać się sekwencję: top beforeEach
, sublevel before
, sublevel beforeEach
. Jednak kolejność, w jakiej Mocha wykonuje haczyki, ma sens: before
hak służy do ustawiania sceny dla grupy testów, podczas gdy beforeEach
test jest przeznaczony dla każdego pojedynczego testu. Kiedy Mocha wykonuje test, wszystkobefore
i beforeEach
haczyki, które zostały określone w describe
który go zawiera, i wszyscy przodkowie, które describe
stosuje się do testu. Mocha wykona każdy before
hak od najbardziej zewnętrznego zakresu do najbardziej wewnętrznego i wszystkie beforeEach
haki od najbardziej zewnętrznego zakresu do najbardziej wewnętrznego. jednak, wszystkie before
zastosowane zaczepy są wykonywane przed jakimkolwiek beforeEach
zaczepem. To wyjaśnia powyższą kolejność: sublevel before
wykonuje się przed, top beforeEach
ponieważ jest to before
hak. W przypadku after
i afterEach
obowiązuje ta sama logika, ale kolejność jest odwrotna: wszystkie afterEach
zastosowane zaczepy są wykonywane przed jakimkolwiek after
zaczepem.
Zauważ również, że Mocha nie dba o to, jak uporządkowałem moje it
połączenia w stosunku do describe
połączenia na najwyższym poziomie describe
. Wykonuje top test1
, top test2
a następnie testy podpoziomowe, mimo że podałem kolejność top test1
, potem testy podpoziomu i wtedy top test2
.
Co chcesz użyć wśród before
, beforeEach
itp naprawdę zależy od specyfiki firmy testów. Jeśli potrzebujesz skonfigurować pozorowany obiekt lub strukturę danych, a ten obiekt lub struktura może być ponownie wykorzystana we wszystkich testach w jednym describe
, możesz użyć go before
do skonfigurowania i after
zniszczenia. Może tak być w przypadku wykonywania testów tylko do odczytu struktury. Jeśli wszystkie twoje testy tylko go odczytują, nie ma potrzeby tworzenia go wielokrotnie. Jeśli każdy test describe
wymaga nowej kopii struktury, ponieważ każdy test modyfikuje strukturę, powinieneś użyć beforeEach
do utworzenia struktury od nowa dla każdego testu, a następnieafterEach
jeśli chcesz go dokładnie rozebrać. Takie postępowanie zapewnia izolację testu: każdy test zaczyna się od znanego stanu i nie jest zależny od obecności lub braku poprzedniego testu, aby zakończyć się pomyślnie.