2012-02-04 43 views
1

我發現測試JQuery動畫的問題。問題是,在jasmine.Clock.useMock()模式下,JQuery在執行效果後不會調用complete函數。茉莉花時鐘嘲諷和JQuery效果'完成'功能並不順利

邏輯:

$('#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()匹配器。

回答

3

請在你的github問題上看到答案。 jQuery特效和Jasmine的模擬時鐘不兼容。

+0

感謝您的建議,但是執行'$ .fx.off = true'也不會產生調用'完成'功能。儘管在其他情況下它確實是有用的模式。 – vkovalskiy 2012-02-12 13:51:42

+0

提到的GitHub問題的鏈接將有所幫助。 https://github.com/pivotal/jasmine/issues/184 – 2012-11-27 14:43:33

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'](); 
    } 
    }); 
});