Node中使用Karma:singleRun为true时让Server.start返回Promise
解决方案
问题出在server.start()返回的Promise仅表示Karma服务器启动完成,而非测试运行结束。真正的测试结束信号是你传入karma.Server构造函数的doneCallback。要实现需求,你需要手动封装一个Promise,在测试完成的回调里resolve结果。
修改后的代码如下:
function startKarma(karmaConfig) { return karma.config .parseConfig( null, karmaConfig, { promiseConfig: true, throwErrors: true } ) .then((parsedKarmaConfig) => { // 手动封装Promise,控制resolve时机 return new Promise((resolve, reject) => { const server = new karma.Server(parsedKarmaConfig, function doneCallback(exitCode) { console.log("Karma has exited with " + exitCode); // 测试完成后,用exitCode resolve Promise resolve(exitCode); }); // 监听服务器启动失败的情况 server.on('error', (err) => { reject(err); }); server.start(); }); }) .catch((rejectReason) => { console.log("Error", rejectReason); throw rejectReason; }); }
调用代码保持不变,现在运行后会看到正确的执行顺序:
START: [Karma服务器启动日志...] [测试运行日志...] Karma has exited with 1 after 1
关键说明
karma.Server的构造函数第二个参数doneCallback是唯一能拿到测试最终exitCode的地方,当singleRun: true时,Karma会在测试全部完成、浏览器退出后调用这个回调。- 放弃依赖
server.start()返回的Promise,因为它的触发时机是服务器启动成功,和测试执行无关。 - 增加
error事件监听,避免服务器启动失败时Promise一直处于pending状态。
这样修改后,你就能在startKarma的Promise回调里拿到每次测试的exitCode,后续多次调用时只需汇总这些值即可判断整体是否成功。
内容的提问来源于stack exchange,提问作者ruffin
相关产品推荐
相关产品推荐

