gpt4 book ai didi

javascript - Sinon,使用 Promise.reject() 到 stub.rejects() 观察不同的行为

转载 作者:行者123 更新时间:2023-12-03 01:41:05 26 4
gpt4 key购买 nike

我在运行测试时遇到问题(在 Node 中),

我正在模拟一个被拒绝的 promise ,我的代码应该重试(使用 promise-retry 如果可能相关的话)。

当我使用 stub.returns(Promise.reject(error)

模拟被拒绝的 Promise 时

我收到了 Uncaught Error 警告(对于我的dummyErrors),即使我在调用函数时捕获了错误...

-注意,这些 Uncaught Error 仅发生在单元测试中,而不是实际调用中。

const mockedFunction = sinon.stub();

const dummyError = new Error('Document is locked');

mockedFunction.onCall(0).returns(Promise.reject(dummyError));
mockedFunction.onCall(0).returns(Promise.reject(dummyError));
mockedFunction.onCall(0).returns(Promise.reject(dummyError));
mockedFunction.onCall(1).returns(Promise.resolve({approved: true}));

我发现通过更改为使用 stub.rejects() 语法:

mockedFunction.onCall(0).rejects(dummyError);
mockedFunction.onCall(1).rejects(dummyError);
mockedFunction.onCall(2).rejects(dummyError));
mockedFunction.onCall(3).resolves({approved: true});

我不再收到 Uncaught Error 警告。

我的问题已经解决,但是我想更好地理解为什么,我查看了 sinon 源代码,看起来 .rejects 的实现没有什么不同

最佳答案

在本质上检测未捕获错误的 Promise 实现中(包括 V8/Node.js),应在同一滴答中捕获来自被拒绝 Promise 的错误,否则会触发 UnhandledPromiseRejectionWarning

这会很好地工作:

let promise = Promise.reject();
promise.catch(() => {});

这将导致潜在的未处理的 promise 并触发警告:

let promise = Promise.reject();
setTimeout(() => {
promise.catch(() => {});
});

如果 Promise.reject(dummyError) 未与 catch(...)then(..., ...) 在同一时间点上,它会触发警告,而在 rejects(dummyError) 的情况下,会在函数调用时创建被拒绝的 Promise,因此这可能是真的:

sinon.spy(Promise, 'reject');
mockedFunction.onCall(0).rejects(dummyError);
expect(Promise.reject).to.have.not.been.called;
mockedFunction();
expect(Promise.reject).to.have.been.called;

rejects(dummyError) 的替代方法是:

mockedFunction.onCall(0).callsFake(() => Promise.reject(dummyError))

关于javascript - Sinon,使用 Promise.reject() 到 stub.rejects() 观察不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50843241/

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