Javascript 测试承诺直到超时才解决

Javascript 测试承诺直到超时才解决,javascript,promise,sinon,chai,Javascript,Promise,Sinon,Chai,我们有一个简单的等待方法,利用节点应用程序中的承诺 exports.wait = (timeout) => { return new Promise((resolve) => { setTimeout(() => { resolve() }, timeout) }); }; 我们试图用西农和柴来测试这种行为 我们按照承诺使用chai获得了一个正确的断言,但它只检查承诺的解析,而无法测试真实行为: 将100 ms的值传递给wait方法时 我

我们有一个简单的等待方法,利用节点应用程序中的承诺

exports.wait = (timeout) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve()
    }, timeout)
  });
};
我们试图用西农和柴来测试这种行为

我们按照承诺使用chai获得了一个正确的断言,但它只检查承诺的解析,而无法测试真实行为:

  • 将100 ms的值传递给wait方法时
  • 我们希望承诺不会在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;
});

但是实现了永远不会变为真,或者至少我们无法阅读它

AssertionError:预期false为true


那么,如何将计时器与chai-sinon下的promise测试相结合,以正确评估我们的定时解决方案?

您可以从以下问题测试代码:

const chai=require('chai');
const expect=chai.expect;
const sinon=要求(“sinon”);
const wait=require('./wait')。wait;
无功时钟;
之前(()=>{
clock=sinon.useFakeTimers();
});
之后(()=>{
clock.restore();
})
它('在给定时间之前不应解析',async()=>{//{
满足=真;
完成();
});
时钟滴答(99);
wait Promise.resolve();//让任何挂起的Promise回调运行
expect(completed).to.be.false;//成功!
时钟。滴答(2);
wait Promise.resolve();//让任何挂起的Promise回调运行
期望(完成)。to.be.true;//成功!
});

详细信息

将使用
setTimeout
计划的回调转换为同步调用

另一方面,
Promise
回调在
Promise
解析时进入队列,直到当前执行消息完成后才运行

在这种情况下,当前正在运行的消息是测试,因此将
completed
设置为
true
then
回调在测试完成后才会运行

您可以使用
async
测试函数并调用
await Promise.resolve()
在您希望暂停当前正在运行的消息并允许任何排队的
Promise
回调运行的任何位置


有关使用带有
承诺的假计时器的更多详细信息,请参见哪个使用了
玩笑
,但概念是相同的。

不知道队列机制,感谢您的帮助,它工作得很好