ssh2-promise exec()方法在STDOUT返回前解析,导致Jest测试失败
解决方案
第一步:确保beforeAll等待异步操作完成
你的beforeAll块没有等待startScript执行完成,Jest会直接启动测试用例,这是核心问题之一。修改代码让beforeAll等待异步操作结束:
describe('Connected endpoint tests with Script On', () => { beforeAll(async () => { await actions.startScript(); }); // 测试用例... });
第二步:轮询验证服务就绪状态(替代setTimeout)
即便脚本执行完毕,服务可能仍需几秒才能完全启动并返回connected:true。此时可以添加轮询逻辑,主动检查HTTP端点状态,直到满足条件或超时:
先在测试文件中新增轮询函数:
async function waitForServiceReady(timeout = 10000, interval = 500) { const startTime = Date.now(); while (Date.now() - startTime < timeout) { try { const response = await fetch('http://你的服务端点地址'); // 替换为实际端点 const data = await response.json(); if (data.connected === true) { return; } } catch (err) { // 服务未就绪时忽略错误,继续轮询 } await new Promise(resolve => setTimeout(resolve, interval)); } throw new Error('服务超时未就绪'); }
再修改beforeAll,在脚本执行后调用轮询函数:
describe('Connected endpoint tests with Script On', () => { beforeAll(async () => { await actions.startScript(); await waitForServiceReady(); }); // 测试用例... });
额外排查点
如果ssh.exec确实在命令输出完成前就resolve,检查脚本是否包含后台运行逻辑(比如nohup或&)——这类操作会让SSH命令提前退出,导致Promise提前解析。若脚本必须后台启动服务,轮询服务状态是比固定延时更可靠的方案。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

