У меня есть таймер и я предполагаю, что определенная функция будет выполнена, когда счетчик рассчитывает до 3.
var a_interval_function = function(){
var counter = 1;
var interval = setInterval(function(){
if(counter === 5){
clearInterval(interval);
}
// run the function when the counter is 3
if(counter === 3){
a_function_should_be_runned();
}
counter++;
}, 500);
return interval;
}
Тем не менее, я не знаю, как установить действительный контрольный пример для проверки счетчика, а также время выполнения функции. кто нибудь знает как это сделать? Что-то вроде следующего:
// and some test case like this
it('a timer test', function(done){
var interval = a_interval_function();
expect(a_function_should_be_runned.state).to.equal({
name: 'runned',
counter: 3,
time: 300,
});
});
Спасибо.
3 ответа
Возможно, вы можете использовать sinon.useFakeTimers()
.
Например:
var sinon = require('sinon');
var expect = require('chai').expect;
var a_function_should_be_runned = sinon.spy();
var a_interval_function = function(){
var counter = 1;
var interval = setInterval(function(){
if(counter === 5){
clearInterval(interval);
}
// run the function when the counter is 3
if(counter === 3){
a_function_should_be_runned();
}
counter++;
}, 500);
return interval;
}
describe('timer tests', function() {
before(function() {
this.clock = sinon.useFakeTimers();
});
after(function() {
this.clock.restore();
});
it('a timer test', function() {
var interval = a_interval_function();
// At time 0, we don't expect the function to have been called.
expect(a_function_should_be_runned.called).to.be.false;
// Advance clock 500ms.
this.clock.tick(500);
expect(a_function_should_be_runned.called).to.be.false;
// Advance clock again (1s since start)
this.clock.tick(500);
expect(a_function_should_be_runned.called).to.be.false;
// Advance clock again (1.5s since start). This should
// trigger the call to `a_function_should_be_runned`.
this.clock.tick(500);
expect(a_function_should_be_runned.called).to.be.true;
});
});
Вот мой наивный подход:
it('a timer test', function(done){
var interval = a_interval_function();
setTimeout(function () {
expect(a_function_should_be_runned.state).to.equal({
name: 'runned',
counter: 3,
time: 300,
});
done();
}, 3.5 * 500);
});
Здесь вы в основном ждете 1,75 с и ожидаете, что функция a_function_should_be_runned
была выполнена по таймауту. Затем вы вызываете функцию expect
, чтобы проверить ваше утверждение. Наконец вы звоните done()
. Обратите внимание, что done()
вызывается внутри функции обратного вызова setTimeout
. Если вы не позвоните done()
, ваш тест просто закончится.
Самый простой способ проверить, выполняется ли код / функция, - это просто вставить предупреждение или console.log
, чтобы у вас было визуальное подтверждение происходящего. Также вы можете console.log
счетчик в вашем интервале, чтобы вы могли видеть счетчик, идущий вверх.
Грамматика нацистов в доме ....
[редактировать]
var a_interval_function = function(){
var counter = 1;
var interval = setInterval(function(){
if(counter === 5){
clearInterval(interval);
}
// run the function when the counter is 3
if(counter === 3 && testFunction()){
a_function_should_be_runned();
}
counter++;
}, 500);
return interval;
}
function testFunction(){
if(KeyboardNinja == 'awesome'){
return true;
} else {
return false;
}
}
Ваш тест никогда не подведет: P
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.