codecamp

Jest 监视插件

Jest 监视插件系统提供了一种方法,可以连接 Jest 的特定部分,并定义在按键时执行代码的监视模式菜单提示。结合这些功能,你可以范围根据自己的工作流程开发自定义的交互式体验。

监视插件界面

  1. class MyWatchPlugin {
  2. // Add hooks to Jest lifecycle events
  3. apply(jestHooks) {}
  4. // Get the prompt information for interactive plugins
  5. getUsageInfo(globalConfig) {}
  6. // Executed when the key from `getUsageInfo` is input
  7. run(globalConfig, updateConfigAndRun) {}
  8. }

连接Jest

要将你的监视插件连接到 Jest,请将其路径添加​watchPlugins​到你的 Jest 配置中:

  1. // jest.config.js
  2. module.exports = {
  3. // ...
  4. watchPlugins: ['path/to/yourWatchPlugin'],
  5. };

自定义监视插件可以为 Jest 事件添加钩子。在监视模式菜单中,可以使用或不使用交互键来添加这些挂钩。

apply(jestHooks)

可以通过实现该​apply​方法来附加 Jest 钩子。此方法接收一个​jestHooks​参数,该参数允许插件挂钩到测试运行生命周期的特定部分。

  1. class MyWatchPlugin {
  2. apply(jestHooks) {}
  3. }

下面是 Jest 中可用的钩子。

jestHooks.shouldRunTestSuite(testSuiteInfo)

返回一个布尔值(或​Promise<boolean>​用于处理异步操作)以指定是否应运行测试。

例如:

  1. class MyWatchPlugin {
  2. apply(jestHooks) {
  3. jestHooks.shouldRunTestSuite(testSuiteInfo => {
  4. return testSuiteInfo.testPath.includes('my-keyword');
  5. });
  6. // or a promise
  7. jestHooks.shouldRunTestSuite(testSuiteInfo => {
  8. return Promise.resolve(testSuiteInfo.testPath.includes('my-keyword'));
  9. });
  10. }
  11. }

jestHooks.onTestRunComplete(results)

在每次测试运行结束时调用。它将测试结果作为参数。

例如:

  1. class MyWatchPlugin {
  2. apply(jestHooks) {
  3. jestHooks.onTestRunComplete(results => {
  4. this._hasSnapshotFailure = results.snapshot.failure;
  5. });
  6. }
  7. }

jestHooks.onFileChange({projects})

每当文件系统发生变化时被调用

  • projects: Array<config: ProjectConfig, testPaths: Array<string>​:包括 Jest 正在观察的所有测试路径。

例如:

  1. class MyWatchPlugin {
  2. apply(jestHooks) {
  3. jestHooks.onFileChange(({projects}) => {
  4. this._projects = projects;
  5. });
  6. }
  7. }

监视菜单集成

自定义监视插件还可以通过在​getUsageInfo​方法中指定键/提示对和​run​执行键的方法来向监视菜单添加或覆盖功能。

getUsageInfo(globalConfig)

要向监视菜单添加一个键,请实现该​getUsageInfo​方法,返回一个键和提示:

  1. class MyWatchPlugin {
  2. getUsageInfo(globalConfig) {
  3. return {
  4. key: 's',
  5. prompt: 'do something',
  6. };
  7. }
  8. }

这将在监视模式菜单中添加一行( ​› Press s to do something.​)

  1. Watch Usage
  2. › Press p to filter by a filename regex pattern.
  3. › Press t to filter by a test name regex pattern.
  4. › Press q to quit watch mode.
  5. › Press s to do something. // <-- This is our plugin
  6. › Press Enter to trigger a test run.

注意:如果你的插件的密钥已作为默认密钥存在,你的插件将覆盖该密钥。

run(全局配置, 更新配置并运行)

要处理来自​getUsageInfo​返回的键的按键事件,可以实现该run​方法。此方法返回一个​Promise<boolean>​ ,当插件想要将控制权返回给 Jest 时,可以解析这个 Promise。​boolean​指定 Jest 在获得控件后是否应重新运行测试

  • globalConfig​: Jest 当前全局配置的表示
  • updateConfigAndRun​:允许在交互式插件运行时触发测试运行。
  1. class MyWatchPlugin {
  2. run(globalConfig, updateConfigAndRun) {
  3. // do something.
  4. }
  5. }

注意:如果调用​updateConfigAndRun​,你的​run​方法不应解析为真值,因为这会触发双重运行。

授权配置密钥

出于稳定性和安全原因,只有部分全局配置键可以使用​updateConfigAndRun​. 目前白名单如下:

  • bail
  • changedSince
  • collectCoverage
  • collectCoverageFrom
  • collectCoverageOnlyFrom
  • coverageDirectory
  • coverageReporters
  • notify
  • notifyMode
  • onlyFailures
  • reporters
  • testNamePattern
  • testPathPattern
  • updateSnapshot
  • verbose

定制

插件可以通过你的 Jest 配置进行定制。

  1. // jest.config.js
  2. module.exports = {
  3. // ...
  4. watchPlugins: [
  5. [
  6. 'path/to/yourWatchPlugin',
  7. {
  8. key: 'k', // <- your custom key
  9. prompt: 'show a custom prompt',
  10. },
  11. ],
  12. ],
  13. };

推荐的配置名称:

  • key​: 修改插件密钥。
  • prompt​:允许用户自定义插件提示中的文本。

如果用户提供了自定义配置,它将作为参数传递给插件构造函数。

  1. class MyWatchPlugin {
  2. constructor({config}) {}
  3. }

选择一把好钥匙

Jest 允许第三方插件覆盖其一些内置功能键,但不是全部。具体来说,以下键是不可覆盖的:

  • ​(清除过滤模式)
  • ​(以交互方式更新不匹配的快照)
  • ​(退出)
  • ​(更新所有不匹配的快照)
  • w​ (显示手表模式使用情况/可用操作)

可以覆盖以下内置功能键:

  • ​(测试文件名模式)
  • ​(测试名称模式)

正如你所期望的那样,可以声明任何未由内置功能使用的密钥。尽量避免使用在各种键盘上难以获得的键(例如​é​, ​​),或者默认情况下不可见的键(例如,许多 Mac 键盘没有诸如​|​, ​\`​,​[`​ 等字符的视觉提示)

发生冲突时

如果你的插件尝试覆盖保留键,Jest 会错误地显示一条描述性消息,例如:

Watch plugin YourFaultyPlugin attempted to register key q, that is reserved internally for quitting watch mode. Please change the configuration key for this plugin.

第三方插件也被禁止覆盖配置的插件列表(​watchPlugins​数组设置)中先前存在的另一个第三方插件已经保留的密钥。发生这种情况时,你还会收到一条错误消息,试图帮助你解决此问题:

Watch plugins YourFaultyPlugin and TheirFaultyPlugin both attempted to register key x. Please change the key configuration for one of the conflicting plugins to avoid overlap.


Jest DOM操作
Jest 迁移指南
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }