Ember のアップグレードにより、Safari でのみ 1 つのテストが中断される 質問する

Ember のアップグレードにより、Safari でのみ 1 つのテストが中断される 質問する

私は捕まえようとしているハイゼンバグ

私たちのプロジェクトを Ember CLI 0.2.0 と Ember 1.10.0 から Ember CLI 0.2.3 と Ember 1.11.1 に更新しています。これは非常に簡単なプロセスでしたが、Safari (7.1.5) でのみ失敗するテストが 1 つだけあります。PhantomJS、Chrome、Firefox では成功します。

困ったことに、テストが失敗するのは、テスト実行が Testem によって開始された場合 (つまり、コードの変更によって自動更新テスト実行がトリガーされた場合) のみです。Qunit Web インターフェイス内からテストを開始すると、テストは成功します。テストのグループ化に関係なく、これら 2 つのことは当てはまります。テスト対象の機能は、ブラウザーで手動で実行すると正常に動作します。

これは統合テストであり、入力の値が変更されると、サーバーから返された値で入力が更新されることを確認します。テストでは、「サーバー」は Pretender インスタンスです。テスト自体は次のようになります。

test('Editing allocation cell', function() {
  visit('/district/periods');

  fillIn(SELECTORS.definitionRowInput(1,0), '100');
  triggerEvent(SELECTORS.definitionRowInput(1,0), 'focusout');
  // The triggerEvent should be tripping the focusOut event on a particular
  // Ember.Textfield subclass, which subsequently leads to a POST request to
  // the server. On Safari, however, the focusOut event isn't being called here.
  // It is called elsewhere in the app, and it works in production.
  // Things that also don't work: keyEvent(element, 'keypress', 16) (a tab), 
  // sending 'blur', sending 'focus-out'.
  // 'focus-out' also fails in Firefox, 'blur' and tab fail in all 4 envs

  andThen(function() {
    equal($(SELECTORS.definitionRowInput(1,0)).val(), '90', 'The updated input takes the return value from the server (even if it is different from input)');
    equal($(SELECTORS.gradeTotal(2)).text(), '120', 'Grade total updates with the new sum');
  });
});

2 番目のandThen()ブロックに注意してください。focusoutコントロールに送信することで、データをサーバーに更新するように、バッキング コンポーネントのコードに指示する必要があります。他のブラウザーはこれを実行します (console.log()確認のため、Pretender レスポンダーに を配置しました) が、Safari は実行しません。イベントに適切に応答していないのではないかと思いますfocusout

このテストが、Ember CLI の更新によってのみ異なるブランチで合格することを考慮すると、この中断を引き起こすために何が変更された可能性がありますか?

ETA: このアップデートで更新されたすべてのライブラリを個別にロールバックしましたが、テストは引き続き失敗します。機能していると思われる唯一の変更は、Ember 自体をロールバックすることです。1.11.0 でも 1.11.1 と同じように壊れるため、変更は 1.10.0 と 1.11.0 の間で行われます。(つまり、精査する必要があるコミットは約 600 件しか残っていません...)

ETA2: 範囲を1.11.0-beta.5と1.11.0の間に絞りました。バウアーリンクEmberのローカルビルドを使用するしかし、ember ビルドはこれまでのところテストの実行において信頼性が低く、これら 2 つのタグの関係は効果的な二分法につながるものではありません。

ベストアンサー1

実際にテストを実行するのを手伝うことはできませんが、履歴をフラット化するのはそれほど難しくありません。あなたが言及したタグの間には49個のパッチがあります。git cherry-pickコマンドのストリームは、私がアップロードしたブランチを示します。https://github.com/rdebath/test/tree/ember.js

そのブランチ上の各コミット (v1.11.0-beta.5 タグの後) は、あなたが言及したタグ間の「適切な」ルートから取得されます。コミット ハッシュはすべて異なります (当然) が、最終的なツリー ハッシュは v1.11.0 と同じなので、これは git bisect に適したパスであるはずです。

ビルドの問題も回避できます。たとえば、問題の原因となっているパッチを見つけるために bisect を使用し、git rebase -iそのパッチをできるだけ遅く適用することをお勧めします。これにより、問題が修正のすぐ隣に配置されますが、すべてを実際のツリーに関連付けることができるようにする必要があるため、これらのコミットを「押しつぶす」ことはおそらく良い考えではありません。

コミットのリストを選択するために、次のコマンドを使用しました。

git log --graph --decorate --oneline --date-order --all

これで、「良い」道筋はかなり明白になります。

おすすめ記事