奇妙なQUnitの動作?:値の設定が持続しないためテストが失敗

QUnit で奇妙な問題が発生しています。

このテストは非常にシンプルで、わかりやすいはずですが…

プラグインの設定が、私が設定したものとは異なる値に変更されています。

Composer が読み込まれた結果として JavaScript が実行されると、アクセプタンステストブロックの早い段階で設定された値が同じではなくなっています!

テストコードで設定したとおり「user」であるべきですが、コンソールログに出力すると、テストが失敗する理由は次のようになります。

何か馬鹿げたことをしていますか? location_topic_default の値が user から none に変わるのはなぜですか?

デフォルトに注意してください。

needs.settings のスコープは、おそらくここで正しいのでしょうか?

まるで needs.settings が順序外で実行され、acceptance スコープを超えているかのようです…

「いいね!」 2

ローカルでこれを試してみました。いくつかの要因が関係しているようです。

参照している siteSettings オブジェクトは、イニシャライザーによって取得され、その後 modifyClass 呼び出しで使用されています。

イニシャライザーは各テストで再実行されます。問題は、以前のテストによって行われた modifyClass 呼び出しを「リセット」する方法がないことです。私たちの解決策は pluginId パラメータです。これは、テストスイート全体で最初の modifyClass 呼び出しのみが実際に使用されることを意味します。将来のテストのイニシャライザーからの modifyClass への呼び出しは無視されます。

通常は問題ありません。modifyClass 呼び出し内のコードは、各テスト実行で変更されることはあまりありません。ただし、この場合、イニシャライザーのスコープから siteSettings 参照を参照しています。

要するに、テストでは、この実装は、最初に実行されたテストの設定で modifyClass が固定されることを意味します。

解決策は、「イニシャライザー」時間ではなく「実行時」に siteSettings 参照を使用することです。model:composer 自体から取得できます。この diff により、テストがパスします。

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 &&
「いいね!」 2

デイビッド、本当にありがとう!それはかなりの落とし穴でした!

「いいね!」 1

デイビッド、

参考までに。

これも同じ理由による問題だと疑っています。

currentUser はイニシャライザでも定義されています。

間違ったテストが後で実行されると、これが評価され、もはや定義されなくなるため、テストを一緒に実行すると「半分」の時間失敗する可能性があります。

Composer モデルには user があると思うので、そちらに切り替えます…

「いいね!」 2

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.