Ответ 1
Вкратце, before
запускается один раз, прежде чем все тесты в describe
и after
запускаются один раз после всех тестов в describe
, тогда как beforeEach
выполняется перед каждым тестом в описании, и afterEach
после каждого теста. Какой из них вы хотите использовать, зависит от вашего фактического теста.
Теперь, для долгого объяснения. Если вы запустите mocha -R min
на этом:
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");
});
});
Вы увидите что-то вроде (я пропустил вывод, который не имеет значения):
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
То, что может показаться неожиданным, если вы посмотрите, что выполняется до и после каждого из тестов на подуровне, заключается в том, что вызываются как обратные вызовы beforeEach
на верхнем уровне, так и на подуровне. То же самое для afterEach
.
Некоторые также удивлены последовательностью sublevel before
, top beforeEach
, sublevel beforeEach
. Они считают, что все крючки во внешнем пространстве должны выполняться перед всеми крючками во внутренней области, поэтому они ожидают последовательность: top beforeEach
, sublevel before
, sublevel beforeEach
. Однако порядок, в котором Mocha выполняет крючки, имеет полный смысл: крюк before
предназначен для установки сцены для группы тестов, тогда как тест beforeEach
предназначен для каждого отдельного теста. Когда Mocha выполняет тест, все крючки before
и beforeEach
, которые были установлены в describe
, который содержит его, и все предки этого describe
применимы к тесту. Mocha будет выполнять каждый before
крючок от внешнего поля до самого внутреннего, а всего beforeEach
- крючок от самой внешней области до самой внутренней. Тем не менее, все before
привязки, которые применяются, выполняются перед любым тэгом beforeEach
. Это объясняет порядок выше: sublevel before
выполняется до top beforeEach
, потому что это крюк before
. И с after
и afterEach
применяется одна и та же логика, но порядок отменяется: все привязанные afterEach
привязки выполняются перед любым тэгом after
.
Также обратите внимание, что Mocha не заботится о том, как я заказал вызовы it
относительно вызова describe
на верхнем уровне describe
. Он выполняет top test1
, top test2
, а затем тесты на уровне подуровня, хотя приказ, который я дал, был top test1
, тогда тесты на уровне подуровня, а затем top test2
.
То, что вы хотите использовать среди before
, beforeEach
и т.д., действительно зависит от специфики ваших тестов. Если вам нужно настроить макет объекта или структуру данных, и этот объект или структура могут быть повторно использованы всеми тестами в одном describe
, вы можете использовать before
для его настройки и after
, чтобы снести его. Это может быть так, если вы выполняете тесты только для чтения в структуре. Если все ваши тесты только читают, то нет необходимости создавать его снова и снова. Если для каждого теста в вашем describe
требуется новая копия структуры, потому что каждый тест изменяет структуру, тогда вы должны использовать beforeEach
для создания структуры заново для каждого теста, а затем afterEach
, если вам нужно оторвать его чисто, Это обеспечивает изоляцию теста: каждый тест начинается с известного состояния и не зависит от наличия или отсутствия предыдущего теста для успеха.