跳转到主要内容

基于模拟宿主的单元测试

在 wasm32-wasip2 上,Rust SDK 调用的是 IDE;在本机上,它调用的是 SDK 自带的模拟宿主。因此 cargo test 不需要 IDE 就能测试插件逻辑:
MockHost::install() 为当前测试安装一个模拟宿主,它:
  • 在你限制能力时像 IDE 一样执行检查:MockHost::install().with_capabilities(&["editor.read"]) 会让其他所有受限调用返回 Error::Denied;
  • 维护带版本号的编辑器文档:type_in_editor 会让插件的下一次编辑过期,方便测试 Error::Stale 的处理;
  • 可以放入项目文件(set_project_root、add_file、add_dir)、设置(set_setting)、界面语言(set_locale)、VCS 状态、符号等;
  • 记录插件做过的事:notifications()、status_items()、storage()、subscriptions()、tasks()、fetches()、logs()、diagnostics()、打开的位置、终端、运行目标;
  • 可以预设应答:选择器和输入框用 answer_next_prompt,HTTP 响应用 on_fetch,程序输出用 on_process。
完整列表见 SDK 的 cargo doc(src/mock.rs)。官方插件 都有原生测试可以参考。

校验插件包

check 按 从磁盘安装插件… 完全相同的规则校验文件夹或 .oiplugin:清单、所有贡献、SVG 净化、翻译目录以及组件。对组件,它检查组件只导入插件 API 和 WASI、导入的每个函数在当前 IDE 中都存在且签名一致,并且导出了 plugin world。随后打印代码大小和 API 版本、分类、激活事件、贡献,以及每个能力和它的风险等级,最后输出 ok。 openidea-plugin build 每次构建后都会运行 check。用其他工具链(componentize-py、jco componentize、TinyGo)构建的包也请用它校验。

在 IDE 中试用

用 openidea-plugin link 链接文件夹,之后每次 openidea-plugin build 后在 设置 › 插件 的插件详情中点击 从磁盘重新加载(或运行 重新加载插件)。见 快速开始。 设置 › 插件 会显示每个插件的状态、失败原因(如果失败了),以及调用统计:近期调用延迟(p95)、崩溃次数、超时的编辑器结果数,以及空闲回收次数。

日志

  • host::log(level, message) 写入 IDE 日志,并标上插件 id。
  • eprintln! 的输出同样会写进日志,panic 的信息会随崩溃一起显示。
  • 只有以 RUST_LOG=info,ide_plugin=trace 启动 IDE 时才会写入 debug 和 trace 级别的日志。
  • 用 帮助 › 在访达中显示日志(macOS)、在资源管理器中显示日志(Windows)或 在文件管理器中显示日志(Linux)打开日志目录。
需要给用户看的输出,请改用输出通道(host::output_append,API 1.4)或通知。

常见问题

测试宿主(贡献者)

在本仓库中修改 SDK、WIT 文件或某个插件后,需要重新构建已提交的组件,并运行宿主的集成测试:
crates/ide-host/tests/plugins.rs 会加载官方插件和 crates/ide-plugin/tests/fixtures/ 中 fixture 的已提交组件。更多内容见 插件宿主。