测试和调试
下面的命令都在你的电脑上用 yonto-plugin 运行。
它用同一个 QuickJS 引擎运行插件,yonto 全局对象和各项限制也和电视上一样,所以在这里能通过的插件,不会换到电视上就不行。
大多数命令可以传入插件所在的目录,不传就用当前目录。
yonto-plugin init my-site --template blank --name "My site"用模板在 ./my-site 里生成一个新插件,并填好 id 和名称。
模板有 blank 和 video-blog,各自的用途见编写插件。
yonto-plugin lint对照模式检查清单,构建文件,并算出代码实际需要的 contractVersion。
它不会发任何请求。
缺少必需的函数、allowedHosts 里有不可能是主机的条目、contractVersion 低于代码用到的版本,这些情况它都会拒绝。
contractVersion 高于所需的版本,则只给出警告。
lint 只读你的代码,不运行它。
通过变量调用宿主函数,或者用展开另一个对象的方式构造导出对象,它的判断会偏保守,所以尽量写得直白一些。
yonto-plugin run . search '"sourdough"'yonto-plugin run . getMediaList '"latest"' '{"page":1}'调用一个函数,打印它返回的 JSON 和发出的请求。 参数是 JSON,所以字符串要加两层引号。
doctor
Section titled “doctor”yonto-plugin doctor它像应用一样把插件走一遍:先取分类,再取列表和第 2 页,然后打开列表里的一个标题,接着搜索,最后调用插件导出的可选函数。 每一步都用上一步的结果当输入。 退出码可以供持续集成使用。
最重要的规则是:成功但结果为空,也算失败。
网站改了页面结构,插件看上去“正常”,却什么也不返回,也不报任何错。
doctor 把这种情况记为 EMPTY_RESULT。
对于应用会悄悄替换掉的值,比如 type: "MOVIE",它也会发出警告。
如果插件的 configSchema 里有必填字段,不提供设置就跑不起来。
把值写进插件旁边的 doctor.json,或者单次运行时设置 YONTO_PLUGIN_CONFIG='{"feedUrl":"…"}',后者优先。
值都必须是字符串,不接受数字,因为数字在这个宿主上能用,换到别的宿主上就不行。
doctor.json 会提交到仓库,所以只写测试用的数据,千万不要放真实的密钥。
yonto-plugin doctor --recordyonto-plugin doctor --replay--record 把每个响应写进 fixtures/,每个 cookie 的值都会换成 redacted。
--replay 不联网,直接用这些数据作答。
对着真实网站录一次,之后改动一秒钟就能离线验证,克隆你插件的人也能这样验证。
需要会话 cookie 的网站无法录制,因为 cookie 绝不能提交。 这类插件请改用普通的单元测试,配合保存下来的页面来测。
命令行工具的引擎同时也是一个库,所以插件自己的逻辑也可以用 node --test 来测。
video-blog 模板在 kangzj/yonto-plugins 的 tools/plugin-cli/test/templates.test.js 里有一个最小的例子:回放录制数据,并用脚本化的传输层测试一个错误。
断言要针对规则,不要针对措辞。
比如测试错误时,检查原因里没有出现片源的名字,这样改写措辞也不会让测试失败。
在应用里试用
Section titled “在应用里试用”用 python3 -m http.server 在该目录启动一个服务,然后在设置、插件、从网址安装里安装该插件 .js 文件的地址。
在 Android 模拟器里,电脑的地址是 10.0.2.2。
在真实的电视上,用电脑在局域网里的地址。
安装程序看的是内容,不看扩展名,所以直接用 .js 就行,不用打包。
安装被拒绝时,对话框会说明原因。 文件超过 1 MiB,或者下载超过 30 秒,都会被拒绝,而一个插件通常只有几十 KB。