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
回调运行的任何位置
有关使用带有
承诺的假计时器的更多详细信息,请参见哪个使用了玩笑
,但概念是相同的。不知道队列机制,感谢您的帮助,它工作得很好