2012-02-04 9 views
1

Я нашел проблему тестирования анимации JQuery. Проблема в том, что в режиме jasmine.Clock.useMock() JQuery не вызывает функцию complete после выполнения эффекта.Jasmine Clock mocking и функция «полного» эффекта JQuery не идет хорошо Хорошо

Логика:

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

Spec:

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' также не вызывает функцию' complete'. Хотя это действительно полезно в других случаях. – vkovalskiy

+0

Ссылка на упомянутую проблему GitHub была бы полезна. https://github.com/pivotal/jasmine/issues/184 –

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