我发现测试JQuery动画时遇到问题。问题是在jasmine.Clock.useMock()
模式期间,JQuery在效果执行后不会调用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()
匹配器。
答案 0 :(得分:3)
请在您的github问题上查看答案。 jQuery效果和Jasmine的模拟时钟不兼容。
答案 1 :(得分: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']();
}
});
});