Sinon clock.tick не опережает время для setTimeout - PullRequest
1 голос
/ 29 апреля 2019

Я пишу тест для функции async, которая выполняет ряд задач и в какой-то момент ждет 60 секунд, прежде чем выполнить еще несколько задач. Я пытаюсь использовать sinon.useFakeTimers(), чтобы пропустить эти 60 секунд, чтобы я мог проверить логику после задержки.

foo.js

module.exports.foo = async f => {
  // ... more code ...
  await new Promise((resolve, reject) => {
    setTimeout(resolve, 60000);
  });
  // ... more code ...
  f();
  // ... more code ...
};

тест-foo.js

const sinon = require('sinon');
const expect = require('chai').expect;

const { foo } = require('./foo');

describe('Module Foo ', function() {
  it('call function after 1 minute', function() {
    var clock = sinon.useFakeTimers();
    const bar = sinon.stub();

    foo(bar);
    expect(bar.called).to.be.false;
    clock.tick(100000);
    expect(bar.called).to.be.true; // this one fails
  });
});

Я пытался поместить sinon.useFakeTimers(); в других местах, но Обещание не разрешается, и заглушку, которую я передаю в foo, не вызывают.

1 Ответ

1 голос
/ 29 апреля 2019

Сделайте ваши тестовые функции async и await разрешенными Promise после повышения ваших часов, чтобы дать обратному вызову Promise, поставленному в очередь await в foo, шанс запустить перед выполнением вашего утверждения:

const sinon = require('sinon');
const expect = require('chai').expect;

const { foo } = require('./foo');

describe('Module Foo ', function() {
  it('call function after 1 minute', async function() {  // <= async test function
    var clock = sinon.useFakeTimers();
    const bar = sinon.stub();

    foo(bar);
    expect(bar.called).to.be.false;  // Success!
    clock.tick(100000);
    await Promise.resolve();  // <= give queued Promise callbacks a chance to run
    expect(bar.called).to.be.true;  // Success!
  });
});

Для получения полной информации см. мой ответ здесь , в котором используются Jest и Jest проверки таймера , но понятия те же и также применяются к Mocha и Sinon фальшивые таймеры .

...