我需要为一个内部有setTimeout()
调用的函数编写一个测试,但我找不到我应该怎么做。
这是函数
// Disables all submit buttons after a submit button is pressed.
var block_all_submit_and_ajax = function( el ) {
// Clone the clicked button, we need to know what button has been clicked so that we can react accordingly
var $clone = $( el ).clone();
// Change the type to hidden
$clone.attr( 'type', 'hidden' );
// Put the hidden button in the DOM
$( el ).after( $clone );
// Disable all submit button. I use setTimeout otherwise this doesn't work in chrome.
setTimeout(function() {
$( '#facebook input[type=submit]' ).prop( 'disabled', true );
}, 10);
// unbind all click handler from ajax
$( '#facebook a.btn' ).unbind( "click" );
// Disable all AJAX buttons.
$( '#facebook a.btn' ).click( function( e ) {
e.preventDefault();
e.stopImmediatePropagation();
} );
};
这是我的测试
it( "Disable all submit buttons", function() {
// Get a button
var $button = $( '#ai1ec_subscribe_users' );
// Call the function
utility_functions.block_all_submit_and_ajax( $button.get(0) );
// check that all submit are disabled
$( '#facebook input[type=submit]' ).each( function( i, el ) {
console.log( 'f' );
expect( el ).toHaveProp( 'disabled', true );
} );
} );
我试过使用jasmine.Clock.useMock();
和jasmine.Clock.tick(11);
,但我不能让事情工作,测试从来没有通过
4条答案
按热度按时间h79rfbju1#
整体方法因您的Jasmine版本而异。
茉莉1.3
可以使用
waitsFor
:如果你知道需要多长时间,你也可以使用
waits
:还有第三种方法,不需要
waits
、waitsFor
和runs
。Jasmine 2.0
你可以使用
done
,测试回调:你可以模拟计时器的行为:
s2j5cfk02#
对于任何人谷歌这个问题,可以找到一个更好的答案timer testing
x6492ojm3#
从Jasmine 2开始,语法发生了变化:http://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support
现在,您可以简单地将
done
回调传递给beforeEach
、it
和afterEach
:更新:自从写了这篇文章,现在也可以使用
async/await
,这是我的首选方法。3bygqnnd4#
我从来没有用茉莉做过任何测试,但我想我理解你的问题。我会稍微调整一下代码,以便您可以将正在调用的函数 Package 在代理函数中,如下所示:
修改正在测试的代码,将setTimeout代码提取到另一个函数中:
原始代码:
修改代码:
接下来,我会像这样修改测试代码: