Странное поведение QUnit?: тест не проходит, потому что установленное значение не сохраняется

У меня странная проблема с QUnit.

Этот тест очень простой и должен быть очевидным… но…

Настройка плагина меняется по сравнению с тем, что я установил.

Когда JavaScript выполняется в результате загрузки Composer, значение настройки, установленное ранее в блоке acceptance, больше не совпадает!

Оно должно быть “user”, как указано в коде теста, но если вывести в консоль, я вижу следующее, из-за чего тест падает:

Делаю ли я что-то глупое? Почему значение location_topic_default меняется с user на none?

Обратите внимание на значение по умолчанию:

Область видимости needs.settings, presumably, здесь корректна?

Кажется, что needs.settings выполняются в неправильном порядке и выходят за пределы области acceptance

Я запустил это локально. Похоже, тут задействовано несколько факторов:

Объект siteSettings, на который вы ссылаетесь, получается инициализатором, а затем используется в вызове modifyClass:

Инициализаторы перезапускаются для каждого теста. Проблема в том, что у нас нет способа «сбросить» любые вызовы modifyClass, сделанные предыдущими тестами. Наше решение — параметр pluginId: он означает, что используется только первый вызов modifyClass во всем наборе тестов. Вызовы modifyClass из инициализаторов в будущих тестах игнорируются.

Обычно это нормально — код внутри вызова modifyClass обычно не меняется при каждом запуске теста. Однако в данном случае вы ссылаетесь на объект siteSettings из области видимости инициализатора.

Коротко: в тестах такая реализация означает, что modifyClass будет «застрявшим» с настройками сайта из того теста, который запустился первым.

Решение — использовать ссылку на siteSettings «во время выполнения», а не «во время инициализации». Мы можем использовать ту, что есть в самом model:composer. Этот дифф позволяет тестам проходить у меня:

diff --git a/assets/javascripts/discourse/initializers/location-edits.js.es6 b/assets/javascripts/discourse/initializers/location-edits.js.es6
index 19e50c0..9d5f882 100644
--- a/assets/javascripts/discourse/initializers/location-edits.js.es6
+++ b/assets/javascripts/discourse/initializers/location-edits.js.es6
@@ -83,7 +83,7 @@ export default {
         @observes("draftKey")
         _setupDefaultLocation() {
           if (this.draftKey === "new_topic") {
-            const topicDefaultLocation = siteSettings.location_topic_default;
+            const topicDefaultLocation = this.siteSettings.location_topic_default;
             if (
               topicDefaultLocation === "user" &&
               currentUser.custom_fields.geo_location &&

Дэвид, большое спасибо! Это действительно ловушка!

Дэвид,

К сведению.

Здесь есть ещё одна проблема, которая, как я подозреваю, вызвана той же причиной:

currentUser также определён в инициализаторе.

Если тест с ошибкой запускается вторым, это выражение вычисляется, и переменная больше не определена, поэтому при совместном запуске тесты могут падать в 50% случаев.

Похоже, что в модели Composer есть поле user, поэтому я переключусь на него…