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

Как область переменных работает в рамках тестовой среды Mocha?

Я относительный новичок ко всем вещам javascript, node.js, mocha и т.д.

В моем коде у меня есть объект Unit, у которого есть disable(), который устанавливает для свойства disabled значение true и isDisabled(), который возвращает свойство disabled. Он также имеет метод nextTurnReset(), который сбрасывает блок в начале следующего хода. Я написал тестовый набор, чтобы проверить это поведение. Сначала я отключу объект, а затем попытаюсь проверить, отключен ли он. Однако единичная переменная внутри моего первого теста, которая находится в анонимной функции, переданной методу Mocha it(), находится в состоянии без отключения, как я наблюдал с отладчиком node.

describe('#disable()', function() {
    var unit = tests.newUnit();
    unit.disable();
    debugger;
    it('disabled off turn?', function() {
        debugger;
        (unit.isDisabled()).should.be.exactly(true);
    });
    unit.nextTurnReset();
    it('disabled on next turn?', function() {
        (unit.isDisabled()).should.be.exactly(true);
    });
    unit.nextTurnReset();
    it('disabled on 2nd turn?', function() {
        (unit.isDisabled()).should.be.exactly(false);
    });
});

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

из использования репликатора node: после первого debugger; оператора unit.disabled == true, но после второго debugger; оператора unit.disabled == false. Я ожидаю, что значение будет истинным в обоих случаях.

Любая идея, почему это так? Кроме того, каков правильный способ написания тестов Mocha для получения ожидаемого результата?

Большое спасибо!

4b9b3361

Ответ 1

Переменная scoping в Mocha точно такая же, как и в любом другом JavaScript-коде. Ваша проблема в том, что вы не понимаете, в каком порядке Mocha выполнит ваш код. Вот что происходит:

  • Вы создаете экземпляр вашего устройства и вызываете disable на нем.

  • Вы регистрируете свой первый тест. Что делает it: он регистрирует тест для будущего выполнения. Тест не выполняется сейчас.

  • Вы вызываете unit.nextTurnReset();, который сбрасывает состояние вашего объекта.

  • Вы регистрируете свой второй тест. Снова он не выполняется сейчас.

  • Вы снова reset ваш объект.

  • Вы регистрируете свой последний тест.

После этого Mocha проводит тесты, которые вы зарегистрировали, и запускает их. К моменту запуска ваших тестов ваш объект находится в состоянии reset, а не отключен.

Мне кажется, что, учитывая желаемое поведение, которое вы описываете, ваш код должен быть:

describe('#disable()', function() {
    var unit = tests.newUnit();

    beforeEach(function () {
        unit.nextTurnReset();
    });

    it('disabled off turn?', function() {
        unit.disable();
        (unit.isDisabled()).should.be.exactly(true);
    });

    it('disabled on next turn?', function() {
        (unit.isDisabled()).should.be.exactly(false);
    });
});

Код, переданный в beforeEach, запускается перед каждым зарегистрированным тестом, чтобы он сбрасывал объект в нужное время.

Ответ 2

Передача состояния между примерами не очень хорошая практика. Что произойдет, если вам нужно запустить тесты в случайном порядке? Или кто-то из проекта решает переместить примеры?

Для меня достаточно, чтобы следующие два примера были достаточно для правильной проверки правильности номера блока.

describe('#disable()', function() {
    it('gets disabled when called on an enabled', function() {
        var unit = tests.newUnit();
        unit.disable();

        (unit.isDisabled()).should.be.exactly(true);
    });

    it('gets enabled when called on a disabled', function() {
        var unit = tests.newUnit();
        unit.disable();
        unit.disable();

        (unit.isDisabled()).should.be.exactly(false);
    });
});