Вызов beforeEach и afterEach с вложенными блоками описания

Я пытаюсь заставить некоторую логику вызываться до и после каждого вложенного описания набора тестов для жасмина, который я пишу.

У меня сейчас есть что-то вроде этого:

describe('Outer describe', function () {
    beforeEach(function () {
        login();
        someOtherFunc();
    });

    afterEach(function () {
        logout();
    });

    describe('inner describe', function () {
        it('spec A', function () {
                expect(true).toBe(true);
        });

        it('spec B', function () {
                expect(true).toBe(true);
        });
    });
});

Я нахожу свои функции в beforeEach и afterEach для каждого it внутри моего внутреннего описания. Я хочу, чтобы они вызывались только один раз для каждого внутреннего описания, которое я имею во внешнем.

Это возможно?

Ответ 1

Я думаю, вы должны использовать "beforeAll" и "afterAll" для спецификаций внутри описания. следующее взято из веб-сайта жасмина: http://jasmine.github.io/2.1/introduction.html

Функция beforeAll вызывается только один раз перед запуском всех спецификаций в описании, а функция afterAll вызывается после завершения всех спецификаций. Эти функции могут использоваться для ускорения комплектов тестов с дорогостоящей настройкой и срывом.

Однако будьте осторожны, используя beforeAll и afterAll! Поскольку они не являются reset между спецификациями, легко случайно протекать состояние между вашими спецификациями, чтобы они ошибочно проходили или терпели неудачу.

Ответ 2

Для этого я определяю общую функцию и затем ссылаюсь на нее в beforeAll/afterAll каждого вложенного describe.

describe('Wrapper', function() {
  var _startup = function(done) {
    login();
    window.setTimeout(done, 150);
  };

  var _shutdown = function() {
    logout();
  };

  describe('Inner 1', function() {
    beforeAll(_startup);
    afterAll(_shutdown);
  });

  describe('Inner 2', function() {
    beforeAll(_startup);
    afterAll(_shutdown);
  });

  describe('Inner 3', function() {
    beforeAll(_startup);
    afterAll(_shutdown);
  });
});

Кажется, это самое чистое из доступных решений.