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

3

请在您的 github 问题上查看答案。jQuery 效果和 Jasmine 的模拟时钟不兼容。

于 2012-02-11T06:50:31.523 回答
0

我是 0.00001%,因为我正在使用带有原型的主干 - 但我将其添加到我的 SpecHelper.js 文件中以绕过我正在使用的脚本效果并确保执行我的回调。

我相信您可以对 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 回答