1

JQuery アニメーションのテストで問題が発生しました。問題は、モード中にJQuery がエフェクトの実行後に関数をjasmine.Clock.useMock()呼び出さないことです。complete

論理:

$('#mydiv').fadeOut('normal', function () {
    // this is called AFTER the test ends
    // but should be called after jasmine.Clock.tick(1000);
    $(this).remove();
})

仕様:

it('should pass', function () {
    jasmine.Clock.useMock();
    // call logic
    jasmine.Clock.tick(1000);
    // using jasmine-jquery matcher
    expect($('#mydiv')).not.toExist();
})

次のメッセージでテストが失敗します。

Expected '<div id="mydiv" style="opacity: 0; "></div>' not to exist.

効果は正常に終了したが、complete関数が呼び出されなかったことを意味します。実際には、テスト ランナーが実行を終了した後に呼び出されます。

JQuery に報告するのがバグなのか、Jasmine 開発者に報告するのがバグなのかわからない。多分誰かが回避策を提案するでしょう。

私の目標は、ロジックの実行後に要素が削除されたことをテストすることなので、not.toExist()マッチャーが必要です。

4

2 に答える 2

0

プロトタイプでバックボーンを使用しているため、私は 0.00001% ですが、これを SpecHelper.js ファイルに追加して、使用している scriptaculous エフェクトを回避し、コールバックが確実に実行されるようにしました。

jqueryでも同じアプローチができると思います。

beforeEach(function() {
  // Override scriptaculous effects so we can ensure our afterFinish
  // callbacks are executed.
  var effects = [
    'Appear', 'BlindDown', 'BlindUp', 'DropOut', 'Fade', 'Fold',
    'Grow', 'Highlight', 'Morph', 'Move', 'Opacity', 'Puff',
    'Pulsate', 'Scale', 'ScrollTo', 'Shake', 'Shrink', 'SlideDown',
    'SlideUp', 'Squish', 'SwitchOff', 'Tween'
  ];
  effects.each(function(name){
    Effect[name] = function(el, options) {
      options = options || (options = {});
      expect(el).toExist();
      if(options['afterFinish']) options['afterFinish']();
    }
  });
});
于 2012-06-09T02:02:06.020 に答える