#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’.