У меня есть таймер и я предполагаю, что определенная функция будет выполнена, когда счетчик рассчитывает до 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,
    });
});

Спасибо.

5
Tony Hsieh 16 Дек 2015 в 13:04

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;
  });
});
7
robertklep 16 Дек 2015 в 11:14

Вот мой наивный подход:

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(), ваш тест просто закончится.

0
borisdiakur 16 Дек 2015 в 10:59

Самый простой способ проверить, выполняется ли код / функция, - это просто вставить предупреждение или 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

-2
Keyboard ninja 16 Дек 2015 в 10:32