Определение тестовых переменных в настройке QUnit

#javascript #scope #qunit

#javascript #область видимости #qunit

Вопрос:

Я понял, что QUnit.module обеспечивает обратные вызовы setup и teardown, связанные с каждым тестированием.

 QUnit.module("unrelated test", {
    setup: function() {
        var usedAcrossTests = "hello";
    }
});
QUnit.test("some test", function(assert) {
    assert.deepEqual(usedAcrossTests, "hello", "uh oh");
});
QUnit.test("another test", function(assert) {
    assert.deepEqual(usedAcrossTests.length, 5, "uh oh");
});
  

Как видно из setup , я хочу объявить переменную для использования в следующих QUnit.test разделах. Однако, поскольку переменная имеет только область действия функции, два теста завершаются неудачей, говоря usedAcrossTests is undefined .

Я мог бы удалить var объявление, но тогда это загрязнило бы глобальную область. Особенно, если у меня будет несколько модулей, я бы предпочел не объявлять переменные, специфичные для теста, как глобальные.

Есть ли способ указать в setup переменной, которая будет использоваться в тестах внутри модуля, не загрязняя глобальную область видимости?

Ответ №1:

Я только что понял, что это проще, чем мой предыдущий ответ. Просто добавьте все свойства, к которым вы хотите получить доступ во всех других тестовых модулях текущего объекта.

 QUnit.module("unrelated test", {
    setup: function() {
        this.usedAcrossTests = "hello"; // add it to current context 'this'
    }
});
  

А затем в каждом тесте, где вы хотите это использовать.

 QUnit.test("some test", function(assert) {
    assert.deepEqual(this.usedAcrossTests, "hello", "uh oh");
});
  

Надеюсь, это поможет

Комментарии:

1. Этот совет по-прежнему полезен в 2019 году при работе с QUnit 2.x (см. qunitjs.com/upgrade-guide-2.x ). Однако нам нужно быть осторожными в сложном наборе тестов с вложенными модулями. Контекст «this» во вложенном модуле не является контекстом «this» родительского модуля, поэтому вам нужно создать переменную в родительском модуле типа «self» (или «that» или что-то еще) и назначить ей родительский контекст «this». Затем вложенный модуль получает доступ к родительскому контексту через переменную ‘self’.