Jest 監(jiān)視插件系統(tǒng)提供了一種方法,可以連接 Jest 的特定部分,并定義在按鍵時(shí)執(zhí)行代碼的監(jiān)視模式菜單提示。結(jié)合這些功能,你可以范圍根據(jù)自己的工作流程開(kāi)發(fā)自定義的交互式體驗(yàn)。
class MyWatchPlugin {
// Add hooks to Jest lifecycle events
apply(jestHooks) {}
// Get the prompt information for interactive plugins
getUsageInfo(globalConfig) {}
// Executed when the key from `getUsageInfo` is input
run(globalConfig, updateConfigAndRun) {}
}
要將你的監(jiān)視插件連接到 Jest,請(qǐng)將其路徑添加?watchPlugins
?到你的 Jest 配置中:
// jest.config.js
module.exports = {
// ...
watchPlugins: ['path/to/yourWatchPlugin'],
};
自定義監(jiān)視插件可以為 Jest 事件添加鉤子。在監(jiān)視模式菜單中,可以使用或不使用交互鍵來(lái)添加這些掛鉤。
可以通過(guò)實(shí)現(xiàn)該?apply
?方法來(lái)附加 Jest 鉤子。此方法接收一個(gè)?jestHooks
?參數(shù),該參數(shù)允許插件掛鉤到測(cè)試運(yùn)行生命周期的特定部分。
class MyWatchPlugin {
apply(jestHooks) {}
}
下面是 Jest 中可用的鉤子。
返回一個(gè)布爾值(或?Promise<boolean>
?用于處理異步操作)以指定是否應(yīng)運(yùn)行測(cè)試。
例如:
class MyWatchPlugin {
apply(jestHooks) {
jestHooks.shouldRunTestSuite(testSuiteInfo => {
return testSuiteInfo.testPath.includes('my-keyword');
});
// or a promise
jestHooks.shouldRunTestSuite(testSuiteInfo => {
return Promise.resolve(testSuiteInfo.testPath.includes('my-keyword'));
});
}
}
在每次測(cè)試運(yùn)行結(jié)束時(shí)調(diào)用。它將測(cè)試結(jié)果作為參數(shù)。
例如:
class MyWatchPlugin {
apply(jestHooks) {
jestHooks.onTestRunComplete(results => {
this._hasSnapshotFailure = results.snapshot.failure;
});
}
}
每當(dāng)文件系統(tǒng)發(fā)生變化時(shí)被調(diào)用
projects: Array<config: ProjectConfig, testPaths: Array<string>
?:包括 Jest 正在觀察的所有測(cè)試路徑。例如:
class MyWatchPlugin {
apply(jestHooks) {
jestHooks.onFileChange(({projects}) => {
this._projects = projects;
});
}
}
自定義監(jiān)視插件還可以通過(guò)在?getUsageInfo
?方法中指定鍵/提示對(duì)和?run
?執(zhí)行鍵的方法來(lái)向監(jiān)視菜單添加或覆蓋功能。
要向監(jiān)視菜單添加一個(gè)鍵,請(qǐng)實(shí)現(xiàn)該?getUsageInfo
?方法,返回一個(gè)鍵和提示:
class MyWatchPlugin {
getUsageInfo(globalConfig) {
return {
key: 's',
prompt: 'do something',
};
}
}
這將在監(jiān)視模式菜單中添加一行( ?? Press s to do something.
?)
Watch Usage
? Press p to filter by a filename regex pattern.
? Press t to filter by a test name regex pattern.
? Press q to quit watch mode.
? Press s to do something. // <-- This is our plugin
? Press Enter to trigger a test run.
注意:如果你的插件的密鑰已作為默認(rèn)密鑰存在,你的插件將覆蓋該密鑰。
要處理來(lái)自?getUsageInfo
?返回的鍵的按鍵事件,可以實(shí)現(xiàn)該run
?方法。此方法返回一個(gè)?Promise<boolean>
? ,當(dāng)插件想要將控制權(quán)返回給 Jest 時(shí),可以解析這個(gè) Promise。?boolean
?指定 Jest 在獲得控件后是否應(yīng)重新運(yùn)行測(cè)試
globalConfig
?: Jest 當(dāng)前全局配置的表示updateConfigAndRun
?:允許在交互式插件運(yùn)行時(shí)觸發(fā)測(cè)試運(yùn)行。
class MyWatchPlugin {
run(globalConfig, updateConfigAndRun) {
// do something.
}
}
注意:如果調(diào)用?updateConfigAndRun
?,你的?run
?方法不應(yīng)解析為真值,因?yàn)檫@會(huì)觸發(fā)雙重運(yùn)行。
出于穩(wěn)定性和安全原因,只有部分全局配置鍵可以使用?updateConfigAndRun
?. 目前白名單如下:
bail
?changedSince
?collectCoverage
?collectCoverageFrom
?collectCoverageOnlyFrom
?coverageDirectory
?coverageReporters
?notify
?notifyMode
?onlyFailures
?reporters
?testNamePattern
?testPathPattern
?updateSnapshot
?verbose
?插件可以通過(guò)你的 Jest 配置進(jìn)行定制。
// jest.config.js
module.exports = {
// ...
watchPlugins: [
[
'path/to/yourWatchPlugin',
{
key: 'k', // <- your custom key
prompt: 'show a custom prompt',
},
],
],
};
推薦的配置名稱(chēng):
key
?: 修改插件密鑰。prompt
?:允許用戶自定義插件提示中的文本。如果用戶提供了自定義配置,它將作為參數(shù)傳遞給插件構(gòu)造函數(shù)。
class MyWatchPlugin {
constructor({config}) {}
}
Jest 允許第三方插件覆蓋其一些內(nèi)置功能鍵,但不是全部。具體來(lái)說(shuō),以下鍵是不可覆蓋的:
c
?(清除過(guò)濾模式)i
?(以交互方式更新不匹配的快照)q
?(退出)u
?(更新所有不匹配的快照)w
? (顯示手表模式使用情況/可用操作)可以覆蓋以下內(nèi)置功能鍵:
p
?(測(cè)試文件名模式)t
?(測(cè)試名稱(chēng)模式)正如你所期望的那樣,可以聲明任何未由內(nèi)置功能使用的密鑰。盡量避免使用在各種鍵盤(pán)上難以獲得的鍵(例如?é
?, ?€
?),或者默認(rèn)情況下不可見(jiàn)的鍵(例如,許多 Mac 鍵盤(pán)沒(méi)有諸如?|
?, ?\`
?,?[`
? 等字符的視覺(jué)提示)
如果你的插件嘗試覆蓋保留鍵,Jest 會(huì)錯(cuò)誤地顯示一條描述性消息,例如:
Watch plugin YourFaultyPlugin attempted to register keyq
, that is reserved internally for quitting watch mode. Please change the configuration key for this plugin.
第三方插件也被禁止覆蓋配置的插件列表(?watchPlugins
?數(shù)組設(shè)置)中先前存在的另一個(gè)第三方插件已經(jīng)保留的密鑰。發(fā)生這種情況時(shí),你還會(huì)收到一條錯(cuò)誤消息,試圖幫助你解決此問(wèn)題:
Watch plugins YourFaultyPlugin and TheirFaultyPlugin both attempted to register keyx
. Please change the key configuration for one of the conflicting plugins to avoid overlap.
更多建議: