我正在维护一些拒绝字符串的代码,这在测试时会产生问题。 我的蓝鸟捕捞行为不正确。
bluebird.rejects('Something')
.catch(e => e === 'Something' /* true */, () => console.log(typeof e) /*string*/)
.catch(() => console.log('should not be here'));
但是,使用sinon.stub().usingPromise('bluebird').rejects('Something');
最终会创建一个名称为Something的错误对象。 完全没有期望。
在有人说我们只支持本地Promises之前,让我们调查一下他们的工作!
Promise.reject('Something')
.catch(e => {
console.log(e === 'Something'); // true
console.log(typeof e); // string
});
嗯,他们没有创建Error类,他们只是抛出一个异常,就像抛出异常一样。
try {
throw 'Something';
} catch (e) {
console.log(e === 'Something'); // true
console.log(typeof e); // string
}
在有人说我们只支持本地Promises之前,让我们调查一下他们的工作!
那是稻草人的谬论。 您已经很了解我们支持承诺库,因为您在示例中使用了它们。
Sinon的维护者完全了解JavaScript promises的工作原理,包括Promise.reject()
会将传递给您的所有内容传递给JavaScript。
我正在维护一些拒绝字符串的代码
在我看来,用String
而不是Error
拒绝承诺确实对Future Developer不利,后者必须调试我们今天编写的内容。 字符串对于调试不是很有用,因为它们不捕获堆栈跟踪。 另一方面, Error
可以。 因此,我认为rejects()
行为是可取的,因为这使得使用调试器可以快速找出问题出在哪里。
看来您不同意,但您所做的唯一声明是,锡诺(Sinn)无法满足您的期望。 如果您认为应该更改默认行为,则请发布原因说明,并记住该更改有可能影响许多用户。
如果有可靠的理由来更改默认行为,那么我无法想象锡南的任何维护者都会反对提出拉动请求来更改它。
由于此问题最近没有活动,因此已被自动标记为陈旧。 如果没有其他活动发生,它将关闭。 感谢你的贡献。
我会说关于堆栈跟踪在某些情况下是否真正有用可能会有不同的意见。 在我的特定情况下,我实际上并不关心堆栈跟踪,只关心错误消息,然后将其传递到其他地方。 因此,我编写了处理字符串和错误类型拒绝原因的代码。 但是,由于sinon为我执行了字符串->错误强制,因此我无法测试处理字符串的代码分支。 因此,我无法获得全部覆盖
堆栈跟踪的有用性和有关是否应该创建错误对象的讨论,我同意通常
const example = sinon.stub().rejects(something);
的行为应与
const example = () => Promise.reject(something);
当前,如果something
是字符串,则不是这种情况。 我会说当前行为是一个错误。
我同意。
由于此问题最近没有活动,因此已被自动标记为陈旧。 如果没有其他活动发生,它将关闭。 感谢你的贡献。
最有用的评论
堆栈跟踪的有用性和有关是否应该创建错误对象的讨论,我同意通常
的行为应与
当前,如果
something
是字符串,则不是这种情况。 我会说当前行为是一个错误。