1

私はいくつかのテストに合格するためにember addonを取得しようとしています。Em.run.next を使用して、実行ループで後で実行されるコードを追加するまで、昨日まで問題なく動作していました。

これが私のテストで行っていることです。

visit('/').then(function() {
  find('bm-select').click();
  andThen(function() {
    equal(1,1, 'yay');
  });
});

問題は、クリックがトリガーされたとき、後の関数が の後に実行されることandThenです。その時までに、すべてのテストが完了し、エラーがスローされます。私は印象を受けており、すべての非同期処理が完了するまで待つ必要があります。

これは、クリックがトリガーされたときに私のコードがどのように見えるかです(クリック時に focusOut イベントがトリガーされます)

lostFocus: function() {
  if(this.get('isOpen')) {
    Em.run.later(this, function() {
      var focussedElement = document.activeElement;
      var isFocussedOut = 
       this.$().has(focussedElement).length === 0 && !this.$().is(focussedElement);
      if(isFocussedOut) {
        this.closeOptions({focus:false});
      }
    }, 0);
  }
}.on('focusOut'),

エラーが発生することがわかりますUncaught TypeError: Cannot read property 'has' of undefined。これは focusOut メソッドからのものです。関数がコンポーネントを実行するまでに、_state は「破棄中」であり、this.$()未定義を返します。

ヘルパーを試してみましたがwait、まだテストを機能させることができません。これは通常どのように行われますか。ビンで実行するテストを抽出しました。ここにリンクがあります。

4

1 に答える 1

0

さらにデバッグした後、問題はタグ「bm-select」の 1 つにありfocusOut、テストのティアダウン メソッドでイベントがトリガーされます。そのため、実行ループ コードが実行されるまでに、コンポーネントは inDOM ではありません。

テスト アプリに非表示の入力フィールドを追加しました。すべてのテストを実行したら、非表示の入力フィールドにフォーカスを設定し、waitテスト ヘルパーを使用します。これで、tear down メソッドが実行されるまでにすべての実行ループ コードが完了します。

于 2014-12-29T11:18:57.843 に答える