我有这样的代码(简化):
getStreamFor(path) {
// both, remote and local, return a Promise
if(...) { return getRemoteFileStream(path); }
else { return getLocalFileStream(path); }
}
getRemoteFileStream(path) {
// should throw in my case (MyError)
const validPath = validatePath(path);
return readStreamIfValid(validPath);
}
在测试案例中:
it('should throw MyError', () => {
return getStreamFor(path)
.then(() => {})
.catch(error => expect(error).to.be.instanceOf(MyError));
});
问题是,当validatePath(path)
方法抛出时(由于路径无效),测试用例承诺中没有任何内容被捕获。我的终端/控制台中的输出是一个常规的例外,好像它没有被捕获。
有没有人知道,为什么Promise不会认出投掷?我怎样才能解决这个问题,而不必考虑另一个"试试catch" (因为诺言应该为我做这件事)?
也许有一般的最佳实践如何构建Promise以避免像这样的错误吞噬?
感谢您的帮助!
答案 0 :(得分:0)
这里的问题是validatePath()
不属于getRemoteFileStream()
一种可能的解决方案如下:
getRemoteFileStream(path) {
return Promise.resolve()
.then(() => validatePath(path))
.then(validPath => readStreamIfValid(validPath));
}
validatePath()
引发的异常现在将在Promise的catch处理程序中处理。