开发者文档/开发指南

测试与调试

用显式 Mock Bridge 测试 UI,验证 Backend 协议,并查看真实 Host 日志。

核对日期:2026 年 9 月 11 日

本页目录

选择正确的测试边界#

浏览器测试验证自己的 UI,真实 Host 会话验证原生接入,安装包验证分发。Mock 返回期望值,不能证明原生服务存在,也不能证明发布包包含所需资源。

层级验证内容
UI 与 Mock Bridge加载、成功、空状态、结构化失败和用户取消
真实 HostManifest 兼容性、服务 Contract、权限和订阅清理
Backend 协议帧、握手、并发消息、错误和关闭
安装包生产资源、原生入口、不依赖开发服务的运行行为

显式使用浏览器 Mock#

测试环境安装匹配 SDK,显式创建独立 transport 并注入 Host facade:

ts
import { createHost, TroveError } from "@trove/plugin-sdk";
import { createMockBridge, createTransport } from "@trove/plugin-sdk/transport";

const bridge = createMockBridge({
  "host.clipboard.readText": () => ({ text: "hello" }),
  "host.notification.show": () => {
    throw new TroveError({ code: "example.unavailable", message: "Try again" });
  },
});
const transport = createTransport({ bridge });
const host = createHost(transport);
try {
  console.log((await host.clipboard.readText()).text);
  const subscription = await host.shortcut.events.triggered(event => {
    console.log(event.registrationId);
  });
  bridge.emit("host.shortcut", "triggered", { registrationId: "demo" });
  await subscription.close();
  console.log((await subscription.closed).code);
  // A separate failure test should call host.notification.show and assert its error UI.
} finally {
  transport.disconnect();
}

Mock handler 接收 (params, { signal }),未注册的方法返回 service.not_found;emit 按服务与主题投递。Mock 不验证真实 Contract,不模拟 macOS 权限,也不实现原生 kit 的订阅参数隔离。相应行为需真实 Host 或协议测试验证。

验证原生 Backend#

第一条读取工程中的 Backend 命令并做基本互操作检查;第二条还根据你提供的真实操作验证业务响应、独立并发、执行取消、反向父调用上下文与期限、事件和取消订阅:

sh
trove test
trove test --cases protocol-cases.json

基本检查不需要额外配置。完整用例文件含 success、error、cancel、reverse;提供方声明 subscribe 时还必须有 subscription。下载 完整用例 和 配套 Rust fixture。

在一个独立 Rust starter 中,将 fixture 保存为 backend/src/main.rs、用例保存为 protocol-cases.json,再执行上述命令。fixture 会反向调用测试器提供的 host.test,不是生产 Host 的服务;不要把测试 fixture 当成自己的业务实现。之后把用例改为你实际的操作与预期值。

测试器使用临时隔离进程,不需要桌面 Host。协议检查有 20 秒总限时;首次编译较慢时先编译 Backend,避免把工具链构建时间当成协议失败。

使用 Trove 调试控制台#

打开 My Curios,进入 Curio 详情,点击查看日志,在开发页查看该工具的输出。也可以从设置 → 开发工具进入后选择项目。展开运行详情可确认 Run ID、版本、开发目录或安装产物摘要。开发时 trove dev 终端与该页面读取同一份输出;安装版也可直接查看,无需再开 dev。

来源可见内容
Host 运行诊断启动、连接、调用开始/结束、耗时、错误、trace ID 与退出
网页 consolelog/info/debug/warn/error、未捕获异常、未处理 Promise 拒绝
Backend stdout/stderr进程实际写出的字节
UI 开发进程由 Host 启动的开发服务输出

按来源筛选,搜索方法名、错误 code 或 trace ID,暂停、恢复跟随或复制当前文本。清屏只移动当前视图的读取位置。Host 默认不记录调用参数、结果数据或文件内容;stderr 本身也不等于业务错误等级。

了解日志边界#

插件输出只缓存在内存。每个来源最多 32 KiB,最多保留 128 个 Curio 的最新运行临时视图;控制台最多显示每路 400 行。超出容量时显示截断/省略标记,CLI 同样提示。

新 Run 替换该 Curio 旧内容;结束后仅保留有界的当前视图片段并标记 ended。退出 Host 后消失。没有日志目录、持久化、轮转、历史列表、归档或文件导出,host.runtime.getPaths() 只返回 data/cache/temp。

正常关闭会限时排空管道末尾。Host 无法提前读到进程尚未 flush 的 C 标准输出;操作时没有输出而退出时集中出现,需要检查 Backend 的缓冲与实际打印位置。崩溃或强杀不能保证保留最后输出。

发布前复现完整流程#

  1. 启动新开发会话,执行一次真实原生调用。
  2. 触发可恢复错误,确认 UI 退出加载状态。
  3. 请求未完成时关闭界面,检查取消和订阅清理。
  4. 停止开发,打包并安装,再次执行核心流程。
  5. 有 Backend 时关闭、重开 Curio,验证配置的生命周期。

若某一步失败,先按常见问题排查缩小原因,再发布版本。