Jest 的配置可以在?package.json
?你項目的文件中定義,也可以通過?jest.config.js
?文件或?--config <path/to/file.js|cjs|mjs|json>
?選項來定義。如果你想用你的?package.json
?來存儲 Jest 的配置,?"jest"
?密鑰應該用在頂層,這樣 Jest 就會知道如何找到你的設(shè)置:
{
"name": "my-project",
"jest": {
"verbose": true
}
}
或者通過 JavaScript:
// jest.config.js
//Sync object
module.exports = {
verbose: true,
};
//Or async function
module.exports = async () => {
return {
verbose: true,
};
};
請記住最后拿到的配置必須是可被 JSON 序列化的。
使用?--config配
?置選項時,JSON 文件絕不能有"jest"鍵值︰
{
"bail": 1,
"verbose": true
}
這些選項可讓你控制 Jest 在?package.json
?文件中的行為。Jest 的理念是默認運行良好,但有時你只需要更多的配置能力。
你可以了解 Jest 的默認選項,以便在必要時擴展它們:
// jest.config.js
const {defaults} = require('jest-config');
module.exports = {
// ...
moduleFileExtensions: [...defaults.moduleFileExtensions, 'ts', 'tsx'],
// ...
};
默認值︰?false
?
這個選項告訴 Jest 測試中所有導入的模塊都應該自動模擬。測試中使用的所有模塊都將具有替換實現(xiàn),從而保持 API 表面。
示例:
// utils.js
export default {
authorize: () => {
return 'token';
},
isAuthorized: secret => secret === 'wizard',
};
//__tests__/automocking.test.js
import utils from '../utils';
test('if utils mocked automatically', () => {
// Public methods of `utils` are now mock functions
expect(utils.authorize.mock).toBeTruthy();
expect(utils.isAuthorized.mock).toBeTruthy();
// You can provide them with your own implementation
// or pass the expected return value
utils.authorize.mockReturnValue('mocked_token');
utils.isAuthorized.mockReturnValue(true);
expect(utils.authorize()).toBe('mocked_token');
expect(utils.isAuthorized('not_wizard')).toBeTruthy();
});
注意:當你進行手動模擬時,節(jié)點模塊會自動模擬(例如:)?__mocks__/lodash.js
?。更多信息在這里。
注意:fs默認情況下不會模擬核心模塊,例如。它們可以被顯式地模擬,例如jest.mock('fs').
默認值: ?0
?
默認情況下,Jest 運行所有測試并在完成后將所有錯誤生成到控制臺中??梢栽诖颂幨褂帽a屌渲眠x項讓 Jest 在n失敗后停止運行測試。將保釋設(shè)置true為與將保釋設(shè)置為相同1。
默認值︰ ?"/tmp/<path>"
?
Jest用來儲存依賴信息緩存的目錄。
Jest 嘗試去掃描你的依賴樹一次(前期)并且把依賴樹緩存起來,其目的就是抹去某些在運行測試時需要進行的文件系統(tǒng)排序。 這一配置選項讓你可以自定義Jest將緩存數(shù)據(jù)儲存在磁盤的那個位置。
默認值︰?false
?
在每次測試之前自動清除模擬調(diào)用和實例。相當于jest.clearAllMocks()每次測試前調(diào)用。這不會刪除可能已提供的任何模擬實現(xiàn)。
默認值︰?false
?
指出是否收集測試時的覆蓋率信息。 因為這些使用?coverage collection
?語句對所有執(zhí)行的文件進行了改造,所以可能會顯著降低測試的速度。
默認值:?undefined
?
一組 glob 模式,指示應為其收集覆蓋率信息的一組文件。如果文件與指定的 glob 模式匹配,即使此文件不存在測試并且測試套件中從不需要它,也會為其收集覆蓋率信息。
示例:
{
"collectCoverageFrom": [
"**/*.{js,jsx}",
"!**/node_modules/**",
"!**/vendor/**"
]
}
這將收集項目中所有文件的覆蓋信息rootDir,除了匹配?**/node_modules/**
?或 的文件?**/vendor/**
?。
注意:該選項要求 ?collectCoverage
?被設(shè)成?true
?,或者通過 ?--coverage
? 參數(shù)來調(diào)用 Jest。
幫助:如果你看到覆蓋輸出,例如……
=============================== Coverage summary ===============================
Statements : Unknown% ( 0/0 )
Branches : Unknown% ( 0/0 )
Functions : Unknown% ( 0/0 )
Lines : Unknown% ( 0/0 )
================================================================================
Jest: Coverage data for global was not found.
很可能你的 glob 模式與任何文件都不匹配。請參閱micromatch文檔以確保你的 glob 兼容。
默認值:undefined
Jest輸出覆蓋信息文件的目錄。
默認值︰?["node_modules"]
?
在執(zhí)行測試之前與所有文件路徑匹配的正則表達式模式字符串數(shù)組。如果文件路徑與任何模式匹配,則將跳過覆蓋信息。
這些模式字符串與完整路徑匹配。使用?<rootDir>
?字符串標記包含項目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:?["<rootDir>/build/", "<rootDir>/node_modules/"]
?。
指示應使用哪個提供程序來檢測代碼以進行覆蓋。允許的值為babel(默認)或v8。
請注意,使用v8被認為是實驗性的。這使用了 V8 的內(nèi)置代碼覆蓋率,而不是基于 Babel 的覆蓋率。它沒有經(jīng)過很好的測試,而且在 Node.js 的最后幾個版本中也得到了改進。使用最新版本的 node(在撰寫本文時為 v14)會產(chǎn)生更好的結(jié)果。
默認值:? ["json", "lcov", "text", "clover"]
?
Jest 在撰寫報道報告時使用的記者姓名列表。可以使用任何伊斯坦布爾記者。
注意:設(shè)置此選項會覆蓋默認值。添加"text"或"text-summary"查看控制臺輸出中的覆蓋范圍摘要。
注意:你可以使用元組形式將其他選項傳遞給 istanbul 報告器。例如:
["json", ["lcov", {"projectRoot": "../../"}]]
有關(guān)選項對象形狀的其他信息,請參考類型定義中的?CoverageReporterWithOptions
?類型。
默認值:?undefined
?
這將用于配置覆蓋結(jié)果的最低閾值強制執(zhí)行。閾值可以指定為global、glob以及目錄或文件路徑。沒有如果達到閾值,Jest 執(zhí)行測試時將失敗。指定為正數(shù)的閾值被視為所需的最小百分比。指定為負數(shù)的閾值表示允許的未覆蓋實體的最大數(shù)量。
例如,如果分支、行和函數(shù)覆蓋率低于 80%,或者有超過 10 個未覆蓋的語句,則使用以下配置 jest 將失敗:
{
...
"jest": {
"coverageThreshold": {
"global": {
"branches": 80,
"functions": 80,
"lines": 80,
"statements": -10
}
}
}
}
如果全局或路徑與全局一起指定,則匹配路徑的覆蓋率數(shù)據(jù)將從總體覆蓋率中減去,并且將獨立應用閾值。通配符模式設(shè)置的閾值將應用到所匹配的所有文件上并單獨計算。 如果找不到路徑指定的文件,則返回錯誤。
例如,基于下面的配置:
{
...
"jest": {
"coverageThreshold": {
"global": {
"branches": 50,
"functions": 50,
"lines": 50,
"statements": 50
},
"./src/components/": {
"branches": 40,
"statements": 40
},
"./src/reducers/**/*.js": {
"statements": 90
},
"./src/api/very-important-module.js": {
"branches": 100,
"functions": 100,
"lines": 100,
"statements": 100
}
}
}
}
Jest 在以下情況下將失敗:
./src/components
?目錄的分支或語句覆蓋率低于 ?40%
?。./src/reducers/**/*.jsglob
?的文件之一的語句覆蓋率低于? 90%
?。./src/api/very-important-module.js
?的任意一種覆蓋率低于 ?100%
? 50%
? (根據(jù) global)默認值:?undefined
?
此選項允許使用自定義依賴項提取器。它必須是一個節(jié)點模塊,它導出一個帶有?extract
?函數(shù)的對象。例如:
const fs = require('fs');
const crypto = require('crypto');
module.exports = {
extract(code, filePath, defaultExtract) {
const deps = defaultExtract(code, filePath);
// Scan the file and add dependencies in `deps` (which is a `Set`)
return deps;
},
getCacheKey() {
return crypto
.createHash('md5')
.update(fs.readFileSync(__filename))
.digest('hex');
},
};
該?extract
?函數(shù)應該返回一個可迭代的(?Array
?、?Set
?等),其中包含在代碼中找到的依賴項。
該模塊還可以包含一個?getCacheKey
?函數(shù)來生成一個緩存鍵,以確定邏輯是否已經(jīng)改變,任何依賴于它的緩存工件都應該被丟棄。
默認值:?undefined
?
允許在測試運行時在測試旁邊打印標簽。這在可能有許多 jest 配置文件的多項目存儲庫中變得更加有用。這直觀地告訴了測試屬于哪個項目。以下是示例有效值。
module.exports = {
displayName: 'CLIENT',
};
或
module.exports = {
displayName: {
name: 'CLIENT',
color: 'blue',
},
};
作為次要的選擇,與該屬性的對象name和color可以傳遞。這允許自定義配置 displayName 的背景顏色。displayName當其值為字符串時默認為白色。Jest 使用粉筆提供顏色。因此,jest 也支持 chalk 支持的所有顏色的有效選項。
默認值︰?false
?
使調(diào)用已棄用的 API 拋出有用的錯誤消息。有助于簡化升級過程。
默認值:?undefined
?
測試文件在vm內(nèi)運行,這會減慢對全局上下文屬性(例如Math)的調(diào)用。使用此選項,你可以指定要在 vm 內(nèi)定義的額外屬性,以加快查找速度。
例如,如果你的測試Math經(jīng)常調(diào)用,你可以通過設(shè)置?extraGlobals
?.
{
...
"jest": {
"extraGlobals": ["Math"]
}
}
默認: ?['']
?
收集代碼覆蓋率時通常會忽略測試文件。使用此選項,你可以覆蓋此行為并在代碼覆蓋率中包含其他被忽略的文件。
例如,如果你在以.t.js擴展名命名的源文件中有測試,如下所示:
// sum.t.js
export function sum(a, b) {
return a + b;
}
if (process.env.NODE_ENV === 'test') {
test('sum', () => {
expect(sum(1, 2)).toBe(3);
});
}
你可以通過設(shè)置 ?forceCoverageMatch
?從這些文件中收集覆蓋率。
{
...
"jest": {
"forceCoverageMatch": ["**/*.t.js"]
}
}
默認值:?{}
?
一組全局變量,在所有測試環(huán)境下都可以訪問。
例如,下面這段代碼將為所有測試環(huán)境創(chuàng)建一個值為?true
?的全局變量?__DEV__
?:
{
...
"jest": {
"globals": {
"__DEV__": true
}
}
}
注意,如果你在這指定了一個全局引用值(例如,對象或者數(shù)組),之后在測試運行中有些代碼改變了這個被引用的值,這個改動對于其他測試不會生效。 此外,?globals
?對象必須是json可序列化的,因此不能用于指定全局函數(shù)。為此,你應該使用?setupfile
?。
默認值:?undefined
?
此選項允許使用自定義全局設(shè)置模塊,該模塊導出在所有測試套件之前觸發(fā)一次的異步函數(shù)。該函數(shù)獲取 Jest 的?globalConfig
?對象作為參數(shù)。
注意:只有當你從該項目運行至少一個測試時,才會觸發(fā)在項目中配置的全局設(shè)置模塊(使用多項目運行器)。
注意:通過定義的任何全局變量?globalSetup
?只能在?globalTeardown
?.你無法在測試套件中檢索此處定義的全局變量。
注意:當代碼轉(zhuǎn)換應用于鏈接的安裝文件時,Jest不會轉(zhuǎn)換?node_modules
?. 這是因為需要加載實際的變壓器(例如?babel
?或?typescript
?)來執(zhí)行轉(zhuǎn)換。
示例:
// setup.js
module.exports = async () => {
// ...
// Set reference to mongod in order to close the server during teardown.
global.__MONGOD__ = mongod;
};
// teardown.js
module.exports = async function () {
await global.__MONGOD__.stop();
};
默認值:?undefined
?
此選項允許使用自定義全局拆卸模塊,該模塊導出在所有測試套件后觸發(fā)一次的異步函數(shù)。該函數(shù)獲取 Jest 的?globalConfig
?對象作為參數(shù)。
注意:在項目中配置的全局拆卸模塊(使用多項目運行器)只有在你從該項目運行至少一個測試時才會被觸發(fā)。
注意:關(guān)于?node_modulesas for
? 的轉(zhuǎn)換的相同注意事項?globalSetup
?適用于?globalTeardown
?。
默認: ?5
?
使用?test.concurrent
?. 一旦插槽被釋放,任何超過此限制的測試都將排隊并執(zhí)行。
默認值︰?["node_modules"]
?
要從所需模塊的位置向上遞歸搜索的目錄名稱數(shù)組。設(shè)置此選項將覆蓋默認值,如果你仍希望搜索node_modules包,請將其與任何其他選項一起包含在內(nèi):?["node_modules", "bower_components"]
?
默認: ?["js", "json", "jsx", "ts", "tsx", "node"]
?
你的模塊使用的文件擴展名數(shù)組。如果你需要沒有指定文件擴展名的模塊,這些是 Jest 將按從左到右的順序查找的擴展名。
我們建議將項目中最常用的擴展放在左側(cè),因此如果你使用的是 ?TypeScript
?,你可能需要考慮將?“ts
?”和?/
?或?“tsx”
?移動到數(shù)組的開頭。
默認值︰?null
?
從正則表達式到模塊名稱或模塊名稱數(shù)組的映射,允許使用單個模塊提取資源,例如圖像或樣式。
映射到別名的模塊在默認情況下是 ?unmock
?的,無論是否啟用 ?automocking
?。
如果要使用文件路徑?<rootDir>
?,請使用字符串標記來引用rootDir值。
此外,你可以使用編號的反向引用替換捕獲的正則表達式組。
示例:
{
"moduleNameMapper": {
"^image![a-zA-Z0-9$_-]+$": "GlobalImageStub",
"^[./a-zA-Z0-9$_-]+\\.png$": "<rootDir>/RelativeImageStub.js",
"module_name_(.*)": "<rootDir>/substituted_module_$1.js",
"assets/(.*)": [
"<rootDir>/images/$1",
"<rootDir>/photos/$1",
"<rootDir>/recipes/$1"
]
}
}
定義映射的順序很重要。圖案被一一檢查,直到適合為止。應首先列出最具體的規(guī)則。對于模塊名稱數(shù)組也是如此。
注意:如果你提供無邊界的模塊名稱?^$
?,可能會導致難以發(fā)現(xiàn)錯誤。例如,relay將替換relay名稱中包含子字符串的所有模塊:relay,react-relay并且graphql-relay都將指向你的存根。
默認值:?[]
?
在模塊加載器將這些路徑視為“可見”之前,與所有模塊路徑匹配的正則表達式模式字符串數(shù)組。如果給定模塊的路徑與任何模式匹配,則它將無法require()在測試環(huán)境中使用。
這些模式字符串與完整路徑匹配。使用<rootDir>字符串標記包含項目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:?["<rootDir>/build/"]
?。
默認值:?[]
?
設(shè)置?NODE_PATHenv
? 變量的替代 ?APImodulePaths
?是解析模塊時要搜索的其他位置的絕對路徑數(shù)組。使用?<rootDir>
?字符串標記包含項目根目錄的路徑。例子:?["<rootDir>/app/"]
?。
默認值︰?false
?
激活測試結(jié)果通知。
注意: Jest 使用node-notifier來顯示桌面通知。在 Windows 上,它會在第一次使用時創(chuàng)建一個新的開始菜單條目,并且不顯示通知。通知將在后續(xù)運行中正確顯示
默認: ?failure-change
?
指定通知模式。需要?notify: true
?.
always
?: 總是發(fā)送通知。failure
?: 當測試失敗時發(fā)送通知。success
?: 當測試通過時發(fā)送通知。change
?:狀態(tài)改變時發(fā)送通知。success-change
?: 測試通過或失敗時發(fā)送通知。failure-change
?:當測試失敗或一旦通過時發(fā)送通知。默認值:?undefined
?
用作 Jest 配置基礎(chǔ)的預設(shè)。預設(shè)應指向根目錄為?jest-preset.json
?或?jest-preset.js
?文件的 ?npm
?模塊。
例如,此預設(shè)?foo-bar
?/?jest-preset.js
?將配置如下:
{
"preset": "foo-bar"
}
預設(shè)也可能與文件系統(tǒng)路徑有關(guān)。
{
"preset": "./node_modules/foo-bar/jest-preset.js"
}
默認: ?'prettier'
?
設(shè)置prettier用于更新內(nèi)聯(lián)快照的節(jié)點模塊的路徑。
默認值:?undefined
?
當projects配置提供了一系列路徑或全局模式時,Jest 將同時在所有指定的項目中運行測試。這對于 monorepos 或同時處理多個項目時非常有用。
{
"projects": ["<rootDir>", "<rootDir>/examples/*"]
}
此示例配置將在根目錄以及示例目錄中的每個文件夾中運行 Jest。你可以在同一個 Jest 實例中運行無限數(shù)量的項目。
該項目的功能也可以用于運行多種配置或多亞軍。為此,你可以傳遞一組配置對象。例如,要在同一個 Jest 調(diào)用中同時運行測試和 ESLint(通過jest-runner-eslint):
{
"projects": [
{
"displayName": "test"
},
{
"displayName": "lint",
"runner": "jest-runner-eslint",
"testMatch": ["<rootDir>/**/*.js"]
}
]
}
注意:使用多項目運行器時,建議?displayName
?為每個項目添加一個。這將在?displayName
?其測試旁邊顯示項目的 。
默認值:?undefined
?
使用此配置選項將自定義報告器添加到 Jest。自定義報告器是一個實現(xiàn)?onRunStart
?、?onTestStart
?、?onTestResult
?、?onRunComplete
?方法的類,這些方法將在發(fā)生任何這些事件時調(diào)用。
如果指定了自定義報告器,默認的 Jest 報告器將被覆蓋。要保留默認報告器,default可以作為模塊名稱傳遞。
這將覆蓋默認記者:
{
"reporters": ["<rootDir>/my-custom-reporter.js"]
}
除了 Jest 提供的默認報告器之外,這還將使用自定義報告器:
{
"reporters": ["default", "<rootDir>/my-custom-reporter.js"]
}
此外,可以通過將?options
?對象作為第二個參數(shù)傳遞來配置自定義報告器:
{
"reporters": [
"default",
["<rootDir>/my-custom-reporter.js", {"banana": "yes", "pineapple": "no"}]
]
}
自定義報告器模塊必須定義一個將 ?aGlobalConfig
?和報告器選項作為構(gòu)造函數(shù)參數(shù)的類:
示例記者:
// my-custom-reporter.js
class MyCustomReporter {
constructor(globalConfig, options) {
this._globalConfig = globalConfig;
this._options = options;
}
onRunComplete(contexts, results) {
console.log('Custom reporter output:');
console.log('GlobalConfig: ', this._globalConfig);
console.log('Options: ', this._options);
}
}
module.exports = MyCustomReporter;
// or export default MyCustomReporter;
自定義報告器還可以通過從?getLastError
?()方法返回錯誤來強制 Jest 以非 0 代碼退出
class MyCustomReporter {
// ...
getLastError() {
if (this._shouldFail) {
return new Error('my-custom-reporter.js reported an error');
}
}
}
有關(guān)方法和參數(shù)類型的完整列表,請參閱Reporter接口封裝/笑話-記者/ src目錄/ types.ts
默認值︰?false
?
每次測試前自動重置模擬狀態(tài)。相當于?jest.resetAllMocks()
?每次測試前調(diào)用。這將導致任何模擬刪除其虛假實現(xiàn),但不會恢復其初始實現(xiàn)。
默認值︰?false
?
默認情況下,每個測試文件都有自己獨立的模塊注冊表。啟用resetModules更進一步,并在運行每個單獨的測試之前重置模塊注冊表。這對于隔離每個測試的模塊非常有用,這樣本地模塊狀態(tài)就不會在測試之間發(fā)生沖突。這可以使用 以編程方式完成jest.resetModules()。
默認值:?undefined
?
此選項允許使用自定義解析器。這個解析器必須是一個節(jié)點模塊,它導出一個函數(shù),期望一個字符串作為要解析的路徑的第一個參數(shù),以及一個具有以下結(jié)構(gòu)的對象作為第二個參數(shù):
{
"basedir": string,
"defaultResolver": "function(request, options)",
"extensions": [string],
"moduleDirectory": [string],
"paths": [string],
"packageFilter": "function(pkg, pkgdir)",
"rootDir": [string]
}
該函數(shù)應該返回應該解析的模塊的路徑,或者如果找不到模塊則拋出錯誤。
注意:作為選項傳遞的 ?defaultResolver
?是 Jest 默認解析器,這在你編寫自定義解析器時可能很有用。它采用與你的自定義參數(shù)相同的參數(shù),例如?(request, options)
?.
例如,如果要尊重 ?Browserify
?的"browser"field,可以使用以下配置:
{
...
"jest": {
"resolver": "browser-resolve"
}
}
通過組合?defaultResolver
?,?packageFilter
?我們可以實現(xiàn)一個?package.json
?“預處理器”,它允許我們改變默認解析器解析模塊的方式。例如,假設(shè)我們想要使用該字段("module"如果它存在),否則回退到"main":
{
...
"jest": {
"resolver": "my-module-resolve"
}
}
// my-module-resolve package
module.exports = (request, options) => {
// Call the defaultResolver, so we leverage its cache, error handling, etc.
return options.defaultResolver(request, {
...options,
// Use packageFilter to process parsed `package.json` before the resolution (see https://www.npmjs.com/package/resolve#resolveid-opts-cb)
packageFilter: pkg => {
return {
...pkg,
// Alter the value of `main` before resolving the package
main: pkg.module || pkg.main,
};
},
});
};
默認值︰?false
?
每次測試前自動恢復模擬狀態(tài)。相當于?jest.restoreAllMocks()
?每次測試前調(diào)用。這將導致任何模擬刪除其虛假實現(xiàn)并恢復其初始實現(xiàn)。
默認:包含你的玩笑目錄的根目錄配置文件 或?qū)ackage.json 或?qū)?a rel="external nofollow" target="_blank" target="_blank">pwd如果沒有package.json被發(fā)現(xiàn)
Jest 應該掃描其中的測試和模塊的根目錄。如果你將 Jest 配置放在你的內(nèi)部package.json并希望根目錄成為你的存儲庫的根目錄,則此配置參數(shù)的值將默認為package.json.
通常,你需要將其設(shè)置為'src'或'lib',對應于代碼在存儲庫中的存儲位置。
請注意,'<rootDir>'在任何其他基于路徑的配置設(shè)置中用作字符串標記將引用回此值。因此,例如,如果你希望setupFiles配置條目指向env-setup.js項目根目錄下的文件,則可以將其值設(shè)置為["<rootDir>/env-setup.js"].
默認值︰?["<rootDir>"]
?
Jest 應該用來搜索文件的目錄路徑列表。
有時你只希望 Jest 在單個子目錄中進行搜索(例如,你的存儲庫中有一個src/目錄),但阻止它訪問存儲庫的其余部分。
注意:雖然rootDir主要用作在其他配置選項中重復使用的令牌,但被rootsJest 內(nèi)部用于定位測試文件和源文件。這也適用于從node_modules(__mocks__將需要位于其中之一roots) 中搜索模塊的手動模擬時。
注意:默認情況下,roots只有一個條目,<rootDir>但在某些情況下,你可能希望在一個項目中擁有多個根,例如roots: ["<rootDir>/src/", "<rootDir>/tests/"].
默認: ?"jest-runner"
?
此選項允許你使用自定義運行程序而不是 Jest 的默認測試運行程序。跑步者的例子包括:
注意:runner屬性值可以省略jest-runner-包名的前綴。
要編寫測試運行程序,請導出一個globalConfig在構(gòu)造函數(shù)中接受的類,并具有runTests帶有簽名的方法:
async runTests(
tests: Array<Test>,
watcher: TestWatcher,
onStart: OnTestStart,
onResult: OnTestSuccess,
onFailure: OnTestFailure,
options: TestRunnerOptions,
): Promise<void>
如果你需要將測試運行程序限制為僅串行運行而不是并行執(zhí)行,則你的類應該將屬性isSerial設(shè)置為true.
默認值:[]
運行一些代碼以配置或設(shè)置測試環(huán)境的模塊的路徑列表。每個 setupFile 將針對每個測試文件運行一次。由于每個測試都在其自己的環(huán)境中運行,因此這些腳本將在執(zhí)行測試代碼本身之前立即在測試環(huán)境中執(zhí)行。
還值得注意的是,setupFiles將在 setupFilesAfterEnv.
默認值:?[]
?
在執(zhí)行套件中的每個測試文件之前,運行一些代碼以配置或設(shè)置測試框架的模塊的路徑列表。由于setupFiles在環(huán)境中安裝測試框架之前執(zhí)行,此腳本文件為你提供了在環(huán)境中安裝測試框架后立即運行某些代碼的機會。
如果你路徑相對于項目的根目錄,請包含<rootDir>在路徑字符串中,例如"<rootDir>/a-configs-folder".
例如,Jestjasmine通過對 jasmine API 進行猴子修補,為該工作提供了幾個插件。如果你想添加更多的 jasmine 插件(或者如果你想要一些自定義的、項目范圍的匹配器),你可以在這些模塊中這樣做。
注意:setupTestFrameworkScriptFile不贊成使用setupFilesAfterEnv.
setupFilesAfterEnvjest.config.js 中的示例數(shù)組:
module.exports = {
setupFilesAfterEnv: ['./jest.setup.js'],
};
示例jest.setup.js文件
jest.setTimeout(10000); // in milliseconds
默認:? 5
?
測試被視為緩慢并在結(jié)果中報告的秒數(shù)。
默認值:?undefined
?
可以解析 test<->snapshot 路徑的模塊的路徑。這個配置選項讓你自定義 Jest 在磁盤上存儲快照文件的位置。
示例快照解析器模塊:
module.exports = {
// resolves from test to snapshot path
resolveSnapshotPath: (testPath, snapshotExtension) =>
testPath.replace('__tests__', '__snapshots__') + snapshotExtension,
// resolves from snapshot to test path
resolveTestPath: (snapshotFilePath, snapshotExtension) =>
snapshotFilePath
.replace('__snapshots__', '__tests__')
.slice(0, -snapshotExtension.length),
// Example test path, used for preflight consistency check of the implementation above
testPathForConsistencyCheck: 'some/__tests__/example.test.js',
};
默認值:
Jest 用于快照測試的快照序列化模塊的路徑列表。
Jest 具有用于內(nèi)置 JavaScript 類型、HTML 元素 (Jest 20.0.0+)、ImmutableJS (Jest 20.0.0+) 和 React 元素的默認序列化器。有關(guān)更多信息,請參閱快照測試教程。
示例序列化器模塊:
// my-serializer-module
module.exports = {
serialize(val, config, indentation, depth, refs, printer) {
return 'Pretty foo: ' + printer(val.foo);
},
test(val) {
return val && val.hasOwnProperty('foo');
},
};
printer 是一個使用現(xiàn)有插件序列化值的函數(shù)。
要my-serializer-module用作序列化程序,配置如下:
{
...
"jest": {
"snapshotSerializers": ["my-serializer-module"]
}
}
最后的測試如下:
test(() => {
const bar = {
foo: {
x: 1,
y: 2,
},
};
expect(bar).toMatchSnapshot();
});
渲染快照:
Pretty foo: Object {
"x": 1,
"y": 2,
}
要使依賴項顯式而不是隱式,你可以調(diào)用expect.addSnapshotSerializer為單個測試文件添加模塊,而不是snapshotSerializers在 Jest 配置中添加其路徑。
可以在此處找到有關(guān)序列化程序 API 的更多信息。
默認值︰?"jsdom"
?
將用于測試的測試環(huán)境。Jest 中的默認環(huán)境是通過jsdom的類似瀏覽器的環(huán)境。如果你正在構(gòu)建節(jié)點服務(wù),則可以使用該node選項來代替使用類似節(jié)點的環(huán)境。
通過@jest-environment在文件頂部添加一個docblock,你可以指定另一個用于該文件中所有測試的環(huán)境:
/**
* @jest-environment jsdom
*/
test('use jsdom in this test file', () => {
const element = document.createElement('div');
expect(element).not.toBeNull();
});
你可以創(chuàng)建自己的模塊,用于設(shè)置測試環(huán)境。模塊必須使用setup,teardown和runScript方法導出類。你還可以通過將變量分配給this.global對象來將變量從該模塊傳遞到你的測試套件- 這將使它們在你的測試套件中作為全局變量可用。
該類可以選擇公開一個異步handleTestEvent方法來綁定到由 觸發(fā)的事件jest-circus。通常情況下,jest-circus測試運行將暫停,直到一個承諾從返回handleTestEvent得到滿足,除了未來事件:start_describe_definition,finish_describe_definition,add_hook,add_test或error(關(guān)于上行最新列表,你可以看看SyncEvent類型的類型定義)。這是由向后兼容性原因和process.on('unhandledRejection', callback)簽名引起的,但對于大多數(shù)用例來說,這通常不是問題。
測試文件中的任何 docblock pragma 都將傳遞給環(huán)境構(gòu)造函數(shù),并可用于每個測試的配置。如果 pragma 沒有值,它將出現(xiàn)在對象中,其值設(shè)置為空字符串。如果 pragma 不存在,則它不會出現(xiàn)在對象中。
注意:TestEnvironment 是沙盒化的。每個測試套件將在他們自己的測試環(huán)境中觸發(fā)設(shè)置/拆卸。
示例:
// my-custom-environment
const NodeEnvironment = require('jest-environment-node');
class CustomEnvironment extends NodeEnvironment {
constructor(config, context) {
super(config, context);
this.testPath = context.testPath;
this.docblockPragmas = context.docblockPragmas;
}
async setup() {
await super.setup();
await someSetupTasks(this.testPath);
this.global.someGlobalObject = createGlobalObject();
// Will trigger if docblock contains @my-custom-pragma my-pragma-value
if (this.docblockPragmas['my-custom-pragma'] === 'my-pragma-value') {
// ...
}
}
async teardown() {
this.global.someGlobalObject = destroyGlobalObject();
await someTeardownTasks();
await super.teardown();
}
runScript(script) {
return super.runScript(script);
}
async handleTestEvent(event, state) {
if (event.name === 'test_start') {
// ...
}
}
}
module.exports = CustomEnvironment;
// my-test-suite
let someGlobalObject;
beforeAll(() => {
someGlobalObject = global.someGlobalObject;
});
默認值:?{}
?
將傳遞給testEnvironment. 相關(guān)選項取決于環(huán)境。例如,你可以覆蓋提供給jsdom 的選項,例如{userAgent: "Agent/007"}.
(默認值:?[ "**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)" ]
?)
Jest 用于檢測測試文件的 glob 模式。默認情況下,它會查找.js,.jsx,.ts和.tsx里面的文件__tests__夾,以及帶有后綴的任何文件.test或.spec(如Component.test.js或Component.spec.js)。它還會找到名為test.js或 的文件spec.js。
有關(guān)你可以指定的模式的詳細信息,請參閱micromatch包。
另見testRegex[字符串 | 大批],但請注意,你不能同時指定這兩個選項。
默認值︰?["node_modules"]
?
在執(zhí)行測試之前與所有測試路徑匹配的正則表達式模式字符串數(shù)組。如果測試路徑匹配任何模式,它將被跳過。
這些模式字符串與完整路徑匹配。使用<rootDir>字符串標記包含項目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:["<rootDir>/build/", "<rootDir>/node_modules/"]。
默認:? (/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$
?
Jest 用來檢測測試文件的一個或多個模式。默認情況下,它會查找.js,.jsx,.ts和.tsx里面的文件__tests__夾,以及帶有后綴的任何文件.test或.spec(如Component.test.js或Component.spec.js)。它還會找到名為test.js或 的文件spec.js。另見testMatch[數(shù)組],但請注意,你不能同時指定這兩個選項。
以下是默認正則表達式的可視化:
├── __tests__
│ └── component.spec.js # test
│ └── anything # test
├── package.json # not test
├── foo.test.js # test
├── bar.spec.jsx # test
└── component.js # not test
注意:testRegex將嘗試使用絕對文件路徑檢測測試文件,因此,具有名稱匹配的文件夾將運行所有文件作為測試
默認值:?undefined
?
此選項允許使用自定義結(jié)果處理器。這個處理器必須是一個節(jié)點模塊,它導出一個函數(shù),期望一個具有以下結(jié)構(gòu)的對象作為第一個參數(shù)并返回它:
{
"success": bool,
"startTime": epoch,
"numTotalTestSuites": number,
"numPassedTestSuites": number,
"numFailedTestSuites": number,
"numRuntimeErrorTestSuites": number,
"numTotalTests": number,
"numPassedTests": number,
"numFailedTests": number,
"numPendingTests": number,
"numTodoTests": number,
"openHandles": Array<Error>,
"testResults": [{
"numFailingTests": number,
"numPassingTests": number,
"numPendingTests": number,
"testResults": [{
"title": string (message in it block),
"status": "failed" | "pending" | "passed",
"ancestorTitles": [string (message in describe blocks)],
"failureMessages": [string],
"numPassingAsserts": number,
"location": {
"column": number,
"line": number
}
},
...
],
"perfStats": {
"start": epoch,
"end": epoch
},
"testFilePath": absolute path to test file,
"coverage": {}
},
...
]
}
默認值︰?jasmine2
?
此選項允許使用自定義測試運行器。默認為 jasmine2??梢酝ㄟ^指定測試運行器實現(xiàn)的路徑來提供自定義測試運行器。
測試運行器模塊必須導出具有以下簽名的函數(shù):
function testRunner(
globalConfig: GlobalConfig,
config: ProjectConfig,
environment: Environment,
runtime: Runtime,
testPath: string,
): Promise<TestResult>;
可以在我們的默認jasmine2 測試運行程序包中找到此類功能的示例。
默認: ?@jest/test-sequencer
?
此選項允許你使用自定義音序器而不是 Jest 的默認值。sort可以選擇返回一個 Promise。
示例:
按字母順序?qū)y試路徑進行排序。
// testSequencer.js
const Sequencer = require('@jest/test-sequencer').default;
class CustomSequencer extends Sequencer {
sort(tests) {
// Test structure information
// https://github.com/facebook/jest/blob/6b8b1404a1d9254e7d5d90a8934087a9c9899dab/packages/jest-runner/src/types.ts#L17-L21
const copyTests = Array.from(tests);
return copyTests.sort((testA, testB) => (testA.path > testB.path ? 1 : -1));
}
}
module.exports = CustomSequencer;
在你的 Jest 配置文件中使用它,如下所示:
{
"testSequencer": "path/to/testSequencer.js"
}
默認: ?5000
?
默認測試超時時間單位為毫秒。
默認:? http://localhost
?
此選項設(shè)置 jsdom 環(huán)境的 URL。它反映在諸如location.href.
默認值︰?real
?
將此值設(shè)置為legacy或fake允許對諸如setTimeout. 當一段代碼設(shè)置了我們不想在測試中等待的長時間超時時,假定時器很有用。
如果值為modern,@sinonjs/fake-timers將用作實現(xiàn)而不是 Jest 自己的遺留實現(xiàn)。這將是 Jest 27 中默認的假實現(xiàn)。
默認:? {"^.+\\.[jt]sx?$": "babel-jest"}
?
從正則表達式到轉(zhuǎn)換器路徑的映射。轉(zhuǎn)換器是一個模塊,提供轉(zhuǎn)換源文件的同步功能。例如,如果你希望能夠在 node 尚不支持的模塊或測試中使用新的語言功能,你可以插入許多編譯器中的一個,將 JavaScript 的未來版本編譯為當前版本。示例:參見examples/ typescript示例或webpack 教程。
此類編譯器的示例包括:
你可以將配置傳遞給轉(zhuǎn)換器,{filePattern: ['path-to-transformer', {options}]}例如,為非默認行為配置 babel-jest,{"\\.js$": ['babel-jest', {rootMode: "upward"}]}
注意:除非文件已更改,否則每個文件只運行一次轉(zhuǎn)換器。在轉(zhuǎn)換器的開發(fā)過程中,運行 Jest--no-cache以經(jīng)常刪除 Jest 的緩存會很有用。
注意:當添加額外的代碼轉(zhuǎn)換器時,這將覆蓋默認配置并且babel-jest不再自動加載。如果要使用它來編譯 JavaScript 或 Typescript,則必須通過添加{"^.+\\.[jt]sx?$": "babel-jest"}到 transform 屬性來顯式定義它。查看babel-jest 插件
默認: ?["/node_modules/", "\\.pnp\\.[^\\\/]+$"]
?
轉(zhuǎn)換前與所有源文件路徑匹配的正則表達式模式字符串數(shù)組。如果測試路徑與任何模式匹配,則不會對其進行轉(zhuǎn)換。
這些模式字符串與完整路徑匹配。使用<rootDir>字符串標記包含項目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。
例子:["<rootDir>/bower_components/", "<rootDir>/node_modules/"]。
有時會發(fā)生(尤其是在 React Native 或 TypeScript 項目中)第三方模塊發(fā)布為未轉(zhuǎn)譯。由于里面的所有文件node_modules默認都沒有被轉(zhuǎn)換,Jest 不會理解這些模塊中的代碼,從而導致語法錯誤。為了克服這個問題,你可以使用transformIgnorePatterns允許轉(zhuǎn)譯此類模塊。你會在React Native Guide 中找到這個用例的一個很好的例子。
默認值:?[]
?
在模塊加載器將自動為它們返回模擬之前,與所有模塊匹配的正則表達式模式字符串數(shù)組。如果模塊的路徑與此列表中的任何模式匹配,則模塊加載器不會自動模擬它。
這對于一些幾乎始終用作實現(xiàn)細節(jié)的常用“實用程序”模塊很有用(例如下劃線/低破折號等)。通常最好的做法是讓這個列表盡可能小,并且在單獨的測試中總是使用顯式j(luò)est.mock()/jest.unmock()調(diào)用。對于測試的其他讀者來說,明確的每個測試設(shè)置更容易推斷測試將運行的環(huán)境。
通過jest.mock()在測試文件的頂部顯式調(diào)用,可以在單個測試中覆蓋此設(shè)置。
默認值︰?false
?
指示是否應在運行期間報告每個單獨的測試。執(zhí)行后,所有錯誤也仍將顯示在底部。請注意,如果只有一個測試文件正在運行,它將默認為true.
默認值:?[]
?
在監(jiān)視模式下重新運行測試之前,與所有源文件路徑匹配的 RegExp 模式數(shù)組。如果文件路徑與任何模式匹配,則在更新時不會觸發(fā)重新運行測試。
這些模式與完整路徑匹配。使用<rootDir>字符串標記包含項目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:?["<rootDir>/node_modules/"]
?。
即使此處未指定任何內(nèi)容,觀察者也會忽略對任何隱藏文件和目錄的更改,即以點 ( .)開頭的文件和文件夾。
默認值:?[]
?
此選項允許你使用自定義手表插件。在此處閱讀有關(guān)手表插件的更多信息。
手表插件的例子包括:
注意:?watchPlugins
?屬性值中的值可以省略?jest-watch-包名的前綴
?。
無默認
此選項允許在?package.json
?. 將注釋文本作為該鍵的值包含在?package.json
?.
示例:
{
"name": "my-project",
"jest": {
"http://": "Comment goes here",
"verbose": true
}
}
更多建議: