Подтвердить что ты не робот

В чем разница между `before()` и `beforeEach()`?

В чем конкретно заключается разница между Mocha before() и beforeEach()? (Тот же вопрос для after() и afterEach().)

Я предполагаю, что before() запускается один раз за блок describe(), а beforeEach() выполняется один раз за тест (блок it()). Это правда?

И когда я захочу использовать один над другим?

4b9b3361

Ответ 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, если вам нужно оторвать его чисто, Это обеспечивает изоляцию теста: каждый тест начинается с известного состояния и не зависит от наличия или отсутствия предыдущего теста для успеха.