我目前正在为我的项目编写一些测试脚本。代码使用ES7编写,并使用babel
首先是一些背景:
假设您运行npm test
,测试文件如下所示:
function foo (bar) {
if (!bar) throw new Error('foooo')
console.log(bar)
}
foo() // No argument given
现在,当您运行此脚本时,npm将显示如下错误:
$ npm ERR! Test failed. See above for more details.
这是所需的输出,出了点问题,你不想发布这个软件,因为那里有错误。
Okey所以我有一个像这样的测试脚本设置:
async function init () {
const status = await someRequestPromise()
if (status.error) throw status.error
console.log(status.result) // Log the result of this async request...
}
init()
首先运行我的测试我使用babel编译ES7:
$ babel src -d dist
然后运行npm test
我也尝试了以下代码,但这并没有改变任何东西......
async function init () {
const status = await someRequestPromise()
if (status.error) throw status.error
console.log(status.result) // Log the result of this async request...
}
try {
init()
} catch (e) {
console.log(e)
}
我想知道如何触发npm来捕获错误并报告测试失败的事实。此外,我想知道如何捕获错误,因为节点现在将它们标记为未处理,即使使用try catch块也是如此。
PS。在await
函数前添加init()
语句会导致语法错误,请不要建议。
答案 0 :(得分:0)
因为async/await
返回promises,你必须通过.catch
处理拒绝(就像控制台输出所示):
const handle = init()
handle
.then((result) => handleSuccess(result))
.catch(({message}) => console.log(message))
try/catch
(至少,根据我的经验)是同步代码。
编辑:
要使脚本“崩溃”,您只需添加process.exit(1)
即可。
const handle = init()
handle
.then((result) => handleSuccess(result))
.catch(({message}) => {
console.log(message)
process.exit(1)
})
答案 1 :(得分:0)
晚了很多年,但我相信这样做的一种正确方法(没有顶级等待)是将 try catch 移动到 'init' 函数中
<input type=hidden name=target value="$$target$$">
Injection Code
Injection
<input type=hidden name=target value="https://test/ff5b27051cb9fatest" accesskey=x onclick=alert(document.location)"">
评论可能不是 100% 准确,但它试图传达想法。
基本上,try catch 可用于解析或拒绝 promise,但前提是在 try/catch 中的某处等待 promise 时