gpt4 book ai didi

javascript - 直到超时 sinon chai 才解决 promise 的测试

转载 作者:行者123 更新时间:2023-11-29 20:41:22 25 4
gpt4 key购买 nike

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

exports.wait = (timeout) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve()
}, timeout)
});
};

我们尝试使用 sinon 和 chai 测试这种行为。

我们设法使用 chai-as-promised 获得了正确的断言,但它只检查 promise 的解决,而我们无法测试真实的行为:

  • 将 100 毫秒的值传递给等待方法时
  • 我们希望 promise 不会在 99 毫秒时解决
  • 我们希望 promise 在 100 毫秒内解决

promise 与计时器的结合确实让我们头疼。

这是我们最后一次尝试的设置:

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: expected false to be true

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

最佳答案

您可以像这样测试问题中的代码:

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

const wait = require('./wait').wait;

var clock;

before(() => {
clock = sinon.useFakeTimers();
});

after(() => {
clock.restore();
})

it('should not resolve until given time', async () => { // <= async
const promise = wait(100);
let fulfilled = false;

promise.then(() => {
fulfilled = true;
done();
});

clock.tick(99);
await Promise.resolve(); // let any pending Promise callbacks run
expect(fulfilled).to.be.false; // Success!
clock.tick(2);
await Promise.resolve(); // let any pending Promise callbacks run
expect(fulfilled).to.be.true; // Success!
});

详情

Fake timers使用 setTimeout 安排回叫进入同步调用。

Promise另一方面,回调在 PromiseJobs queue 中排队。当Promise解析,直到当前执行的消息完成后才运行。

在这种情况下,当前运行的消息是测试,所以then设置 fulfilled 的回调至 true直到测试完成之后才会运行。

您可以使用 async测试函数并调用 await Promise.resolve();在您想暂停当前正在运行的消息并允许任何排队的消息的任何时候Promise要运行的回调。

有关将假定时器与 Promises 结合使用的更多详细信息见this answer使用Jest , 但概念是一样的。

关于javascript - 直到超时 sinon chai 才解决 promise 的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55440400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com