ジャスミンユニットテストでシノンを使用してjQueryアニメーションを偽造するにはどうすればよいですか?
-
27-10-2019 - |
質問
私は1秒のjQueryを持っています .animate
ページの読み込みから5秒後に起動するアクション。ジャスミンユニットテストコードにシノンタイマーを設定し、7秒のダニの後にテストして、後のアニメーション特性が本来あるべきかどうかを確認しました。
うまくいかないので、アニメーション自体のインスタンスをJasmine HTMLテストページに配置して、何が起こっているのかをよりよく確認しました。
FirefoxとChromeでは、ページが読み込まれ、アニメーション関数が呼び出され、ユニットテストはすぐに失敗し、その後(すぐに)アニメーションが目に見えて発生します。
IE、Opera、Safariでは、ページのロードがあり、アニメーション関数が呼び出され、単位テストはすぐに失敗し、アニメーションは目に見えて発生することはありません。
私が望んでいたのは、次のことでした(すべてのブラウザで):
- ページの読み込み、アニメーション関数が呼び出され、アニメーションが瞬時に完了し、ユニットテストがすぐに成功します。
見つめている シノンのドキュメント, 、それは偽のタイマーが次のプロセスをカバーしています:setTimeout
, clearTimeout
, setInterval
, clearInterval
, Date
jqueryのアニメーションがどのように機能するかはわかりませんが、CSSを使用して移行していると思います。 useFakeTimers
, 、だから私はこれが問題だと思います。ただし、問題について正しい場合は、解決策が必要です。
たぶん私はシノン以外の何かを試すべきですか?ジャスミン waits()
このテストでは完全に機能しますが、私のような焦りの人々にとっては信じられないほど非現実的です。
他に提案はありますか?私はJSユニットテストに慣れていないことに注意してください。そのため、あいまいな答えは私を助ける以上に私を混乱させます。 ; o)
解決
使用できます jQueryオフ jquery効果をオフにするには:
jQuery.fx.off = true
これは、イベントが発生するのを7秒間待つことの問題を解決することはありませんが、予想どおりにDOMが変更されたことをテストできることを意味します。
他のヒント
私は同じ問題を抱えていました。 jqueryのアニメーションが利用しているので起こると思います requestAnimationFrame()
代わりに利用可能である場合 setTimeout()
.
私はすべてのブラウザ固有の設定でこの問題を回避しました requestAnimationFrame
上の関数 window
nullへのオブジェクト:
window.webkitRequestAnimationFrame = null;
window.mozRequestAnimationFrame = null;
window.oRequestAnimationFrame = null;
このコードが実行されることを確認してください 前 jQueryはロードされています。
Sinonjsがここに示したように、それは可能だと思います: http://sinonjs.org/qunit
test("should animate element over 500ms", function () {
var el = jQuery("<div></div>");
el.appendTo(document.body);
el.animate({ height: "200px", width: "200px" });
this.clock.tick(510);
equals("200px", el.css("height"));
equals("200px", el.css("width"));
});