You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:52:13