У нас есть простой метод ожидания, использующий обещания в нашем приложении узла
exports.wait = (timeout) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve()
}, timeout)
});
};
Мы попытались проверить это поведение, используя sinon и chai.
Нам удалось получить правильное утверждение, используя chai-as-обещанное, но оно только проверило, что обещание разрешается, но мы не смогли проверить реальное поведение:
- при передаче значения 100 мс в метод ожидания
- мы ожидаем, что обещание не будет выполнено в 99мс
- мы ожидаем, что обещание разрешится в 100мс
Сочетание обещания с таймерами действительно вызывает у нас головную боль.
Вот наша последняя попытка:
const chai = require('chai');
const expect = chai.expect;
const sinon = require('sinon');
chai.use(require('sinon-chai'));
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
const wait = require('./wait').wait;
var clock;
before(() => {
clock = sinon.useFakeTimers();
});
after(() => {
clock.restore();
})
it('should not resolve until given time', (done) => {
const promise = wait(100);
let fulfilled = false;
promise.then(() => {
fulfilled = true;
done();
});
clock.tick(99);
expect(fulfilled).to.be.false;
clock.tick(2);
expect(fulfilled).to.be.true;
});
Но fulfilled
никогда не переходит на истину, или, по крайней мере, мы не можем его прочитать.
AssertionError: ожидается, что false будет true
Как тогда смешивать таймеры с тестированием обещаний в рамках Chai - Sinon, чтобы правильно использовать наше решение по времени?