Jest 的配置可以在?package.json
?你項(xiàng)目的文件中定義,也可以通過?jest.config.js
?文件或?--config <path/to/file.js|cjs|mjs|json>
?選項(xiàng)來定義。如果你想用你的?package.json
?來存儲 Jest 的配置,?"jest"
?密鑰應(yīng)該用在頂層,這樣 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配
?置選項(xiàng)時(shí),JSON 文件絕不能有"jest"鍵值︰
{
"bail": 1,
"verbose": true
}
這些選項(xiàng)可讓你控制 Jest 在?package.json
?文件中的行為。Jest 的理念是默認(rèn)運(yùn)行良好,但有時(shí)你只需要更多的配置能力。
你可以了解 Jest 的默認(rèn)選項(xiàng),以便在必要時(shí)擴(kuò)展它們:
// jest.config.js
const {defaults} = require('jest-config');
module.exports = {
// ...
moduleFileExtensions: [...defaults.moduleFileExtensions, 'ts', 'tsx'],
// ...
};
默認(rèn)值︰?false
?
這個(gè)選項(xiàng)告訴 Jest 測試中所有導(dǎo)入的模塊都應(yīng)該自動模擬。測試中使用的所有模塊都將具有替換實(shí)現(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();
});
注意:當(dāng)你進(jìn)行手動模擬時(shí),節(jié)點(diǎn)模塊會自動模擬(例如:)?__mocks__/lodash.js
?。更多信息在這里。
注意:fs默認(rèn)情況下不會模擬核心模塊,例如。它們可以被顯式地模擬,例如jest.mock('fs').
默認(rèn)值: ?0
?
默認(rèn)情況下,Jest 運(yùn)行所有測試并在完成后將所有錯(cuò)誤生成到控制臺中??梢栽诖颂幨褂帽a屌渲眠x項(xiàng)讓 Jest 在n失敗后停止運(yùn)行測試。將保釋設(shè)置true為與將保釋設(shè)置為相同1。
默認(rèn)值︰ ?"/tmp/<path>"
?
Jest用來儲存依賴信息緩存的目錄。
Jest 嘗試去掃描你的依賴樹一次(前期)并且把依賴樹緩存起來,其目的就是抹去某些在運(yùn)行測試時(shí)需要進(jìn)行的文件系統(tǒng)排序。 這一配置選項(xiàng)讓你可以自定義Jest將緩存數(shù)據(jù)儲存在磁盤的那個(gè)位置。
默認(rèn)值︰?false
?
在每次測試之前自動清除模擬調(diào)用和實(shí)例。相當(dāng)于jest.clearAllMocks()每次測試前調(diào)用。這不會刪除可能已提供的任何模擬實(shí)現(xiàn)。
默認(rèn)值︰?false
?
指出是否收集測試時(shí)的覆蓋率信息。 因?yàn)檫@些使用?coverage collection
?語句對所有執(zhí)行的文件進(jìn)行了改造,所以可能會顯著降低測試的速度。
默認(rèn)值:?undefined
?
一組 glob 模式,指示應(yīng)為其收集覆蓋率信息的一組文件。如果文件與指定的 glob 模式匹配,即使此文件不存在測試并且測試套件中從不需要它,也會為其收集覆蓋率信息。
示例:
{
"collectCoverageFrom": [
"**/*.{js,jsx}",
"!**/node_modules/**",
"!**/vendor/**"
]
}
這將收集項(xiàng)目中所有文件的覆蓋信息rootDir,除了匹配?**/node_modules/**
?或 的文件?**/vendor/**
?。
注意:該選項(xiàng)要求 ?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 兼容。
默認(rèn)值:undefined
Jest輸出覆蓋信息文件的目錄。
默認(rèn)值︰?["node_modules"]
?
在執(zhí)行測試之前與所有文件路徑匹配的正則表達(dá)式模式字符串?dāng)?shù)組。如果文件路徑與任何模式匹配,則將跳過覆蓋信息。
這些模式字符串與完整路徑匹配。使用?<rootDir>
?字符串標(biāo)記包含項(xiàng)目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:?["<rootDir>/build/", "<rootDir>/node_modules/"]
?。
指示應(yīng)使用哪個(gè)提供程序來檢測代碼以進(jìn)行覆蓋。允許的值為babel(默認(rèn))或v8。
請注意,使用v8被認(rèn)為是實(shí)驗(yàn)性的。這使用了 V8 的內(nèi)置代碼覆蓋率,而不是基于 Babel 的覆蓋率。它沒有經(jīng)過很好的測試,而且在 Node.js 的最后幾個(gè)版本中也得到了改進(jìn)。使用最新版本的 node(在撰寫本文時(shí)為 v14)會產(chǎn)生更好的結(jié)果。
默認(rèn)值:? ["json", "lcov", "text", "clover"]
?
Jest 在撰寫報(bào)道報(bào)告時(shí)使用的記者姓名列表??梢允褂萌魏?a href="http://www.o2fo.com/targetlink?url=https://github.com/istanbuljs/istanbuljs/tree/master/packages/istanbul-reports/lib" target="_blank">伊斯坦布爾記者。
注意:設(shè)置此選項(xiàng)會覆蓋默認(rèn)值。添加"text"或"text-summary"查看控制臺輸出中的覆蓋范圍摘要。
注意:你可以使用元組形式將其他選項(xiàng)傳遞給 istanbul 報(bào)告器。例如:
["json", ["lcov", {"projectRoot": "../../"}]]
有關(guān)選項(xiàng)對象形狀的其他信息,請參考類型定義中的?CoverageReporterWithOptions
?類型。
默認(rèn)值:?undefined
?
這將用于配置覆蓋結(jié)果的最低閾值強(qiáng)制執(zhí)行。閾值可以指定為global、glob以及目錄或文件路徑。沒有如果達(dá)到閾值,Jest 執(zhí)行測試時(shí)將失敗。指定為正數(shù)的閾值被視為所需的最小百分比。指定為負(fù)數(shù)的閾值表示允許的未覆蓋實(shí)體的最大數(shù)量。
例如,如果分支、行和函數(shù)覆蓋率低于 80%,或者有超過 10 個(gè)未覆蓋的語句,則使用以下配置 jest 將失?。?/p>
{
...
"jest": {
"coverageThreshold": {
"global": {
"branches": 80,
"functions": 80,
"lines": 80,
"statements": -10
}
}
}
}
如果全局或路徑與全局一起指定,則匹配路徑的覆蓋率數(shù)據(jù)將從總體覆蓋率中減去,并且將獨(dú)立應(yīng)用閾值。通配符模式設(shè)置的閾值將應(yīng)用到所匹配的所有文件上并單獨(dú)計(jì)算。 如果找不到路徑指定的文件,則返回錯(cuò)誤。
例如,基于下面的配置:
{
...
"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 在以下情況下將失?。?/p>
./src/components
?目錄的分支或語句覆蓋率低于 ?40%
?。./src/reducers/**/*.jsglob
?的文件之一的語句覆蓋率低于? 90%
?。./src/api/very-important-module.js
?的任意一種覆蓋率低于 ?100%
? 50%
? (根據(jù) global)默認(rèn)值:?undefined
?
此選項(xiàng)允許使用自定義依賴項(xiàng)提取器。它必須是一個(gè)節(jié)點(diǎn)模塊,它導(dǎo)出一個(gè)帶有?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ù)應(yīng)該返回一個(gè)可迭代的(?Array
?、?Set
?等),其中包含在代碼中找到的依賴項(xiàng)。
該模塊還可以包含一個(gè)?getCacheKey
?函數(shù)來生成一個(gè)緩存鍵,以確定邏輯是否已經(jīng)改變,任何依賴于它的緩存工件都應(yīng)該被丟棄。
默認(rèn)值:?undefined
?
允許在測試運(yùn)行時(shí)在測試旁邊打印標(biāo)簽。這在可能有許多 jest 配置文件的多項(xiàng)目存儲庫中變得更加有用。這直觀地告訴了測試屬于哪個(gè)項(xiàng)目。以下是示例有效值。
module.exports = {
displayName: 'CLIENT',
};
或
module.exports = {
displayName: {
name: 'CLIENT',
color: 'blue',
},
};
作為次要的選擇,與該屬性的對象name和color可以傳遞。這允許自定義配置 displayName 的背景顏色。displayName當(dāng)其值為字符串時(shí)默認(rèn)為白色。Jest 使用粉筆提供顏色。因此,jest 也支持 chalk 支持的所有顏色的有效選項(xiàng)。
默認(rèn)值︰?false
?
使調(diào)用已棄用的 API 拋出有用的錯(cuò)誤消息。有助于簡化升級過程。
默認(rèn)值:?undefined
?
測試文件在vm內(nèi)運(yùn)行,這會減慢對全局上下文屬性(例如Math)的調(diào)用。使用此選項(xiàng),你可以指定要在 vm 內(nèi)定義的額外屬性,以加快查找速度。
例如,如果你的測試Math經(jīng)常調(diào)用,你可以通過設(shè)置?extraGlobals
?.
{
...
"jest": {
"extraGlobals": ["Math"]
}
}
默認(rèn): ?['']
?
收集代碼覆蓋率時(shí)通常會忽略測試文件。使用此選項(xiàng),你可以覆蓋此行為并在代碼覆蓋率中包含其他被忽略的文件。
例如,如果你在以.t.js擴(kuò)展名命名的源文件中有測試,如下所示:
// 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"]
}
}
默認(rèn)值:?{}
?
一組全局變量,在所有測試環(huán)境下都可以訪問。
例如,下面這段代碼將為所有測試環(huán)境創(chuàng)建一個(gè)值為?true
?的全局變量?__DEV__
?:
{
...
"jest": {
"globals": {
"__DEV__": true
}
}
}
注意,如果你在這指定了一個(gè)全局引用值(例如,對象或者數(shù)組),之后在測試運(yùn)行中有些代碼改變了這個(gè)被引用的值,這個(gè)改動對于其他測試不會生效。 此外,?globals
?對象必須是json可序列化的,因此不能用于指定全局函數(shù)。為此,你應(yīng)該使用?setupfile
?。
默認(rèn)值:?undefined
?
此選項(xiàng)允許使用自定義全局設(shè)置模塊,該模塊導(dǎo)出在所有測試套件之前觸發(fā)一次的異步函數(shù)。該函數(shù)獲取 Jest 的?globalConfig
?對象作為參數(shù)。
注意:只有當(dāng)你從該項(xiàng)目運(yùn)行至少一個(gè)測試時(shí),才會觸發(fā)在項(xiàng)目中配置的全局設(shè)置模塊(使用多項(xiàng)目運(yùn)行器)。
注意:通過定義的任何全局變量?globalSetup
?只能在?globalTeardown
?.你無法在測試套件中檢索此處定義的全局變量。
注意:當(dāng)代碼轉(zhuǎn)換應(yīng)用于鏈接的安裝文件時(shí),Jest不會轉(zhuǎn)換?node_modules
?. 這是因?yàn)樾枰虞d實(shí)際的變壓器(例如?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();
};
默認(rèn)值:?undefined
?
此選項(xiàng)允許使用自定義全局拆卸模塊,該模塊導(dǎo)出在所有測試套件后觸發(fā)一次的異步函數(shù)。該函數(shù)獲取 Jest 的?globalConfig
?對象作為參數(shù)。
注意:在項(xiàng)目中配置的全局拆卸模塊(使用多項(xiàng)目運(yùn)行器)只有在你從該項(xiàng)目運(yùn)行至少一個(gè)測試時(shí)才會被觸發(fā)。
注意:關(guān)于?node_modulesas for
? 的轉(zhuǎn)換的相同注意事項(xiàng)?globalSetup
?適用于?globalTeardown
?。
默認(rèn): ?5
?
使用?test.concurrent
?. 一旦插槽被釋放,任何超過此限制的測試都將排隊(duì)并執(zhí)行。
默認(rèn)值︰?["node_modules"]
?
要從所需模塊的位置向上遞歸搜索的目錄名稱數(shù)組。設(shè)置此選項(xiàng)將覆蓋默認(rèn)值,如果你仍希望搜索node_modules包,請將其與任何其他選項(xiàng)一起包含在內(nèi):?["node_modules", "bower_components"]
?
默認(rèn): ?["js", "json", "jsx", "ts", "tsx", "node"]
?
你的模塊使用的文件擴(kuò)展名數(shù)組。如果你需要沒有指定文件擴(kuò)展名的模塊,這些是 Jest 將按從左到右的順序查找的擴(kuò)展名。
我們建議將項(xiàng)目中最常用的擴(kuò)展放在左側(cè),因此如果你使用的是 ?TypeScript
?,你可能需要考慮將?“ts
?”和?/
?或?“tsx”
?移動到數(shù)組的開頭。
默認(rèn)值︰?null
?
從正則表達(dá)式到模塊名稱或模塊名稱數(shù)組的映射,允許使用單個(gè)模塊提取資源,例如圖像或樣式。
映射到別名的模塊在默認(rèn)情況下是 ?unmock
?的,無論是否啟用 ?automocking
?。
如果要使用文件路徑?<rootDir>
?,請使用字符串標(biāo)記來引用rootDir值。
此外,你可以使用編號的反向引用替換捕獲的正則表達(dá)式組。
示例:
{
"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"
]
}
}
定義映射的順序很重要。圖案被一一檢查,直到適合為止。應(yīng)首先列出最具體的規(guī)則。對于模塊名稱數(shù)組也是如此。
注意:如果你提供無邊界的模塊名稱?^$
?,可能會導(dǎo)致難以發(fā)現(xiàn)錯(cuò)誤。例如,relay將替換relay名稱中包含子字符串的所有模塊:relay,react-relay并且graphql-relay都將指向你的存根。
默認(rèn)值:?[]
?
在模塊加載器將這些路徑視為“可見”之前,與所有模塊路徑匹配的正則表達(dá)式模式字符串?dāng)?shù)組。如果給定模塊的路徑與任何模式匹配,則它將無法require()在測試環(huán)境中使用。
這些模式字符串與完整路徑匹配。使用<rootDir>字符串標(biāo)記包含項(xiàng)目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:?["<rootDir>/build/"]
?。
默認(rèn)值:?[]
?
設(shè)置?NODE_PATHenv
? 變量的替代 ?APImodulePaths
?是解析模塊時(shí)要搜索的其他位置的絕對路徑數(shù)組。使用?<rootDir>
?字符串標(biāo)記包含項(xiàng)目根目錄的路徑。例子:?["<rootDir>/app/"]
?。
默認(rèn)值︰?false
?
激活測試結(jié)果通知。
注意: Jest 使用node-notifier來顯示桌面通知。在 Windows 上,它會在第一次使用時(shí)創(chuàng)建一個(gè)新的開始菜單條目,并且不顯示通知。通知將在后續(xù)運(yùn)行中正確顯示
默認(rèn): ?failure-change
?
指定通知模式。需要?notify: true
?.
always
?: 總是發(fā)送通知。failure
?: 當(dāng)測試失敗時(shí)發(fā)送通知。success
?: 當(dāng)測試通過時(shí)發(fā)送通知。change
?:狀態(tài)改變時(shí)發(fā)送通知。success-change
?: 測試通過或失敗時(shí)發(fā)送通知。failure-change
?:當(dāng)測試失敗或一旦通過時(shí)發(fā)送通知。默認(rèn)值:?undefined
?
用作 Jest 配置基礎(chǔ)的預(yù)設(shè)。預(yù)設(shè)應(yīng)指向根目錄為?jest-preset.json
?或?jest-preset.js
?文件的 ?npm
?模塊。
例如,此預(yù)設(shè)?foo-bar
?/?jest-preset.js
?將配置如下:
{
"preset": "foo-bar"
}
預(yù)設(shè)也可能與文件系統(tǒng)路徑有關(guān)。
{
"preset": "./node_modules/foo-bar/jest-preset.js"
}
默認(rèn): ?'prettier'
?
設(shè)置prettier用于更新內(nèi)聯(lián)快照的節(jié)點(diǎn)模塊的路徑。
默認(rèn)值:?undefined
?
當(dāng)projects配置提供了一系列路徑或全局模式時(shí),Jest 將同時(shí)在所有指定的項(xiàng)目中運(yùn)行測試。這對于 monorepos 或同時(shí)處理多個(gè)項(xiàng)目時(shí)非常有用。
{
"projects": ["<rootDir>", "<rootDir>/examples/*"]
}
此示例配置將在根目錄以及示例目錄中的每個(gè)文件夾中運(yùn)行 Jest。你可以在同一個(gè) Jest 實(shí)例中運(yùn)行無限數(shù)量的項(xiàng)目。
該項(xiàng)目的功能也可以用于運(yùn)行多種配置或多亞軍。為此,你可以傳遞一組配置對象。例如,要在同一個(gè) Jest 調(diào)用中同時(shí)運(yùn)行測試和 ESLint(通過jest-runner-eslint):
{
"projects": [
{
"displayName": "test"
},
{
"displayName": "lint",
"runner": "jest-runner-eslint",
"testMatch": ["<rootDir>/**/*.js"]
}
]
}
注意:使用多項(xiàng)目運(yùn)行器時(shí),建議?displayName
?為每個(gè)項(xiàng)目添加一個(gè)。這將在?displayName
?其測試旁邊顯示項(xiàng)目的 。
默認(rèn)值:?undefined
?
使用此配置選項(xiàng)將自定義報(bào)告器添加到 Jest。自定義報(bào)告器是一個(gè)實(shí)現(xiàn)?onRunStart
?、?onTestStart
?、?onTestResult
?、?onRunComplete
?方法的類,這些方法將在發(fā)生任何這些事件時(shí)調(diào)用。
如果指定了自定義報(bào)告器,默認(rèn)的 Jest 報(bào)告器將被覆蓋。要保留默認(rèn)報(bào)告器,default可以作為模塊名稱傳遞。
這將覆蓋默認(rèn)記者:
{
"reporters": ["<rootDir>/my-custom-reporter.js"]
}
除了 Jest 提供的默認(rèn)報(bào)告器之外,這還將使用自定義報(bào)告器:
{
"reporters": ["default", "<rootDir>/my-custom-reporter.js"]
}
此外,可以通過將?options
?對象作為第二個(gè)參數(shù)傳遞來配置自定義報(bào)告器:
{
"reporters": [
"default",
["<rootDir>/my-custom-reporter.js", {"banana": "yes", "pineapple": "no"}]
]
}
自定義報(bào)告器模塊必須定義一個(gè)將 ?aGlobalConfig
?和報(bào)告器選項(xiàng)作為構(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;
自定義報(bào)告器還可以通過從?getLastError
?()方法返回錯(cuò)誤來強(qiáng)制 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
默認(rèn)值︰?false
?
每次測試前自動重置模擬狀態(tài)。相當(dāng)于?jest.resetAllMocks()
?每次測試前調(diào)用。這將導(dǎo)致任何模擬刪除其虛假實(shí)現(xiàn),但不會恢復(fù)其初始實(shí)現(xiàn)。
默認(rèn)值︰?false
?
默認(rèn)情況下,每個(gè)測試文件都有自己獨(dú)立的模塊注冊表。啟用resetModules更進(jìn)一步,并在運(yùn)行每個(gè)單獨(dú)的測試之前重置模塊注冊表。這對于隔離每個(gè)測試的模塊非常有用,這樣本地模塊狀態(tài)就不會在測試之間發(fā)生沖突。這可以使用 以編程方式完成jest.resetModules()。
默認(rèn)值:?undefined
?
此選項(xiàng)允許使用自定義解析器。這個(gè)解析器必須是一個(gè)節(jié)點(diǎn)模塊,它導(dǎo)出一個(gè)函數(shù),期望一個(gè)字符串作為要解析的路徑的第一個(gè)參數(shù),以及一個(gè)具有以下結(jié)構(gòu)的對象作為第二個(gè)參數(shù):
{
"basedir": string,
"defaultResolver": "function(request, options)",
"extensions": [string],
"moduleDirectory": [string],
"paths": [string],
"packageFilter": "function(pkg, pkgdir)",
"rootDir": [string]
}
該函數(shù)應(yīng)該返回應(yīng)該解析的模塊的路徑,或者如果找不到模塊則拋出錯(cuò)誤。
注意:作為選項(xiàng)傳遞的 ?defaultResolver
?是 Jest 默認(rèn)解析器,這在你編寫自定義解析器時(shí)可能很有用。它采用與你的自定義參數(shù)相同的參數(shù),例如?(request, options)
?.
例如,如果要尊重 ?Browserify
?的"browser"field,可以使用以下配置:
{
...
"jest": {
"resolver": "browser-resolve"
}
}
通過組合?defaultResolver
?,?packageFilter
?我們可以實(shí)現(xiàn)一個(gè)?package.json
?“預(yù)處理器”,它允許我們改變默認(rèn)解析器解析模塊的方式。例如,假設(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,
};
},
});
};
默認(rèn)值︰?false
?
每次測試前自動恢復(fù)模擬狀態(tài)。相當(dāng)于?jest.restoreAllMocks()
?每次測試前調(diào)用。這將導(dǎo)致任何模擬刪除其虛假實(shí)現(xiàn)并恢復(fù)其初始實(shí)現(xiàn)。
默認(rèn):包含你的玩笑目錄的根目錄配置文件 或?qū)ackage.json 或?qū)?a rel="external nofollow" target="_blank" target="_blank">pwd如果沒有package.json被發(fā)現(xiàn)
Jest 應(yīng)該掃描其中的測試和模塊的根目錄。如果你將 Jest 配置放在你的內(nèi)部package.json并希望根目錄成為你的存儲庫的根目錄,則此配置參數(shù)的值將默認(rèn)為package.json.
通常,你需要將其設(shè)置為'src'或'lib',對應(yīng)于代碼在存儲庫中的存儲位置。
請注意,'<rootDir>'在任何其他基于路徑的配置設(shè)置中用作字符串標(biāo)記將引用回此值。因此,例如,如果你希望setupFiles配置條目指向env-setup.js項(xiàng)目根目錄下的文件,則可以將其值設(shè)置為["<rootDir>/env-setup.js"].
默認(rèn)值︰?["<rootDir>"]
?
Jest 應(yīng)該用來搜索文件的目錄路徑列表。
有時(shí)你只希望 Jest 在單個(gè)子目錄中進(jìn)行搜索(例如,你的存儲庫中有一個(gè)src/目錄),但阻止它訪問存儲庫的其余部分。
注意:雖然rootDir主要用作在其他配置選項(xiàng)中重復(fù)使用的令牌,但被rootsJest 內(nèi)部用于定位測試文件和源文件。這也適用于從node_modules(__mocks__將需要位于其中之一roots) 中搜索模塊的手動模擬時(shí)。
注意:默認(rèn)情況下,roots只有一個(gè)條目,<rootDir>但在某些情況下,你可能希望在一個(gè)項(xiàng)目中擁有多個(gè)根,例如roots: ["<rootDir>/src/", "<rootDir>/tests/"].
默認(rèn): ?"jest-runner"
?
此選項(xiàng)允許你使用自定義運(yùn)行程序而不是 Jest 的默認(rèn)測試運(yùn)行程序。跑步者的例子包括:
注意:runner屬性值可以省略jest-runner-包名的前綴。
要編寫測試運(yùn)行程序,請導(dǎo)出一個(gè)globalConfig在構(gòu)造函數(shù)中接受的類,并具有runTests帶有簽名的方法:
async runTests(
tests: Array<Test>,
watcher: TestWatcher,
onStart: OnTestStart,
onResult: OnTestSuccess,
onFailure: OnTestFailure,
options: TestRunnerOptions,
): Promise<void>
如果你需要將測試運(yùn)行程序限制為僅串行運(yùn)行而不是并行執(zhí)行,則你的類應(yīng)該將屬性isSerial設(shè)置為true.
默認(rèn)值:[]
運(yùn)行一些代碼以配置或設(shè)置測試環(huán)境的模塊的路徑列表。每個(gè) setupFile 將針對每個(gè)測試文件運(yùn)行一次。由于每個(gè)測試都在其自己的環(huán)境中運(yùn)行,因此這些腳本將在執(zhí)行測試代碼本身之前立即在測試環(huán)境中執(zhí)行。
還值得注意的是,setupFiles將在 setupFilesAfterEnv.
默認(rèn)值:?[]
?
在執(zhí)行套件中的每個(gè)測試文件之前,運(yùn)行一些代碼以配置或設(shè)置測試框架的模塊的路徑列表。由于setupFiles在環(huán)境中安裝測試框架之前執(zhí)行,此腳本文件為你提供了在環(huán)境中安裝測試框架后立即運(yùn)行某些代碼的機(jī)會。
如果你路徑相對于項(xiàng)目的根目錄,請包含<rootDir>在路徑字符串中,例如"<rootDir>/a-configs-folder".
例如,Jestjasmine通過對 jasmine API 進(jìn)行猴子修補(bǔ),為該工作提供了幾個(gè)插件。如果你想添加更多的 jasmine 插件(或者如果你想要一些自定義的、項(xiàng)目范圍的匹配器),你可以在這些模塊中這樣做。
注意:setupTestFrameworkScriptFile不贊成使用setupFilesAfterEnv.
setupFilesAfterEnvjest.config.js 中的示例數(shù)組:
module.exports = {
setupFilesAfterEnv: ['./jest.setup.js'],
};
示例jest.setup.js文件
jest.setTimeout(10000); // in milliseconds
默認(rèn):? 5
?
測試被視為緩慢并在結(jié)果中報(bào)告的秒數(shù)。
默認(rèn)值:?undefined
?
可以解析 test<->snapshot 路徑的模塊的路徑。這個(gè)配置選項(xiàng)讓你自定義 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',
};
默認(rèn)值:
Jest 用于快照測試的快照序列化模塊的路徑列表。
Jest 具有用于內(nèi)置 JavaScript 類型、HTML 元素 (Jest 20.0.0+)、ImmutableJS (Jest 20.0.0+) 和 React 元素的默認(rèn)序列化器。有關(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 是一個(gè)使用現(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,
}
要使依賴項(xiàng)顯式而不是隱式,你可以調(diào)用expect.addSnapshotSerializer為單個(gè)測試文件添加模塊,而不是snapshotSerializers在 Jest 配置中添加其路徑。
可以在此處找到有關(guān)序列化程序 API 的更多信息。
默認(rèn)值︰?"jsdom"
?
將用于測試的測試環(huán)境。Jest 中的默認(rèn)環(huán)境是通過jsdom的類似瀏覽器的環(huán)境。如果你正在構(gòu)建節(jié)點(diǎn)服務(wù),則可以使用該node選項(xiàng)來代替使用類似節(jié)點(diǎn)的環(huán)境。
通過@jest-environment在文件頂部添加一個(gè)docblock,你可以指定另一個(gè)用于該文件中所有測試的環(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方法導(dǎo)出類。你還可以通過將變量分配給this.global對象來將變量從該模塊傳遞到你的測試套件- 這將使它們在你的測試套件中作為全局變量可用。
該類可以選擇公開一個(gè)異步handleTestEvent方法來綁定到由 觸發(fā)的事件jest-circus。通常情況下,jest-circus測試運(yùn)行將暫停,直到一個(gè)承諾從返回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ù),并可用于每個(gè)測試的配置。如果 pragma 沒有值,它將出現(xiàn)在對象中,其值設(shè)置為空字符串。如果 pragma 不存在,則它不會出現(xiàn)在對象中。
注意:TestEnvironment 是沙盒化的。每個(gè)測試套件將在他們自己的測試環(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;
});
默認(rèn)值:?{}
?
將傳遞給testEnvironment. 相關(guān)選項(xiàng)取決于環(huán)境。例如,你可以覆蓋提供給jsdom 的選項(xiàng),例如{userAgent: "Agent/007"}.
(默認(rèn)值:?[ "**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)" ]
?)
Jest 用于檢測測試文件的 glob 模式。默認(rèn)情況下,它會查找.js,.jsx,.ts和.tsx里面的文件__tests__夾,以及帶有后綴的任何文件.test或.spec(如Component.test.js或Component.spec.js)。它還會找到名為test.js或 的文件spec.js。
有關(guān)你可以指定的模式的詳細(xì)信息,請參閱micromatch包。
另見testRegex[字符串 | 大批],但請注意,你不能同時(shí)指定這兩個(gè)選項(xiàng)。
默認(rèn)值︰?["node_modules"]
?
在執(zhí)行測試之前與所有測試路徑匹配的正則表達(dá)式模式字符串?dāng)?shù)組。如果測試路徑匹配任何模式,它將被跳過。
這些模式字符串與完整路徑匹配。使用<rootDir>字符串標(biāo)記包含項(xiàng)目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:["<rootDir>/build/", "<rootDir>/node_modules/"]。
默認(rèn):? (/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$
?
Jest 用來檢測測試文件的一個(gè)或多個(gè)模式。默認(rèn)情況下,它會查找.js,.jsx,.ts和.tsx里面的文件__tests__夾,以及帶有后綴的任何文件.test或.spec(如Component.test.js或Component.spec.js)。它還會找到名為test.js或 的文件spec.js。另見testMatch[數(shù)組],但請注意,你不能同時(shí)指定這兩個(gè)選項(xiàng)。
以下是默認(rèn)正則表達(dá)式的可視化:
├── __tests__
│ └── component.spec.js # test
│ └── anything # test
├── package.json # not test
├── foo.test.js # test
├── bar.spec.jsx # test
└── component.js # not test
注意:testRegex將嘗試使用絕對文件路徑檢測測試文件,因此,具有名稱匹配的文件夾將運(yùn)行所有文件作為測試
默認(rèn)值:?undefined
?
此選項(xiàng)允許使用自定義結(jié)果處理器。這個(gè)處理器必須是一個(gè)節(jié)點(diǎn)模塊,它導(dǎo)出一個(gè)函數(shù),期望一個(gè)具有以下結(jié)構(gòu)的對象作為第一個(gè)參數(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": {}
},
...
]
}
默認(rèn)值︰?jasmine2
?
此選項(xiàng)允許使用自定義測試運(yùn)行器。默認(rèn)為 jasmine2。可以通過指定測試運(yùn)行器實(shí)現(xiàn)的路徑來提供自定義測試運(yùn)行器。
測試運(yùn)行器模塊必須導(dǎo)出具有以下簽名的函數(shù):
function testRunner(
globalConfig: GlobalConfig,
config: ProjectConfig,
environment: Environment,
runtime: Runtime,
testPath: string,
): Promise<TestResult>;
可以在我們的默認(rèn)jasmine2 測試運(yùn)行程序包中找到此類功能的示例。
默認(rèn): ?@jest/test-sequencer
?
此選項(xiàng)允許你使用自定義音序器而不是 Jest 的默認(rèn)值。sort可以選擇返回一個(gè) Promise。
示例:
按字母順序?qū)y試路徑進(jìn)行排序。
// 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"
}
默認(rèn): ?5000
?
默認(rèn)測試超時(shí)時(shí)間單位為毫秒。
默認(rèn):? http://localhost
?
此選項(xiàng)設(shè)置 jsdom 環(huán)境的 URL。它反映在諸如location.href.
默認(rèn)值︰?real
?
將此值設(shè)置為legacy或fake允許對諸如setTimeout. 當(dāng)一段代碼設(shè)置了我們不想在測試中等待的長時(shí)間超時(shí)時(shí),假定時(shí)器很有用。
如果值為modern,@sinonjs/fake-timers將用作實(shí)現(xiàn)而不是 Jest 自己的遺留實(shí)現(xiàn)。這將是 Jest 27 中默認(rèn)的假實(shí)現(xiàn)。
默認(rèn):? {"^.+\\.[jt]sx?$": "babel-jest"}
?
從正則表達(dá)式到轉(zhuǎn)換器路徑的映射。轉(zhuǎn)換器是一個(gè)模塊,提供轉(zhuǎn)換源文件的同步功能。例如,如果你希望能夠在 node 尚不支持的模塊或測試中使用新的語言功能,你可以插入許多編譯器中的一個(gè),將 JavaScript 的未來版本編譯為當(dāng)前版本。示例:參見examples/ typescript示例或webpack 教程。
此類編譯器的示例包括:
你可以將配置傳遞給轉(zhuǎn)換器,{filePattern: ['path-to-transformer', {options}]}例如,為非默認(rèn)行為配置 babel-jest,{"\\.js$": ['babel-jest', {rootMode: "upward"}]}
注意:除非文件已更改,否則每個(gè)文件只運(yùn)行一次轉(zhuǎn)換器。在轉(zhuǎn)換器的開發(fā)過程中,運(yùn)行 Jest--no-cache以經(jīng)常刪除 Jest 的緩存會很有用。
注意:當(dāng)添加額外的代碼轉(zhuǎn)換器時(shí),這將覆蓋默認(rèn)配置并且babel-jest不再自動加載。如果要使用它來編譯 JavaScript 或 Typescript,則必須通過添加{"^.+\\.[jt]sx?$": "babel-jest"}到 transform 屬性來顯式定義它。查看babel-jest 插件
默認(rèn): ?["/node_modules/", "\\.pnp\\.[^\\\/]+$"]
?
轉(zhuǎn)換前與所有源文件路徑匹配的正則表達(dá)式模式字符串?dāng)?shù)組。如果測試路徑與任何模式匹配,則不會對其進(jìn)行轉(zhuǎn)換。
這些模式字符串與完整路徑匹配。使用<rootDir>字符串標(biāo)記包含項(xiàng)目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。
例子:["<rootDir>/bower_components/", "<rootDir>/node_modules/"]。
有時(shí)會發(fā)生(尤其是在 React Native 或 TypeScript 項(xiàng)目中)第三方模塊發(fā)布為未轉(zhuǎn)譯。由于里面的所有文件node_modules默認(rèn)都沒有被轉(zhuǎn)換,Jest 不會理解這些模塊中的代碼,從而導(dǎo)致語法錯(cuò)誤。為了克服這個(gè)問題,你可以使用transformIgnorePatterns允許轉(zhuǎn)譯此類模塊。你會在React Native Guide 中找到這個(gè)用例的一個(gè)很好的例子。
默認(rèn)值:?[]
?
在模塊加載器將自動為它們返回模擬之前,與所有模塊匹配的正則表達(dá)式模式字符串?dāng)?shù)組。如果模塊的路徑與此列表中的任何模式匹配,則模塊加載器不會自動模擬它。
這對于一些幾乎始終用作實(shí)現(xiàn)細(xì)節(jié)的常用“實(shí)用程序”模塊很有用(例如下劃線/低破折號等)。通常最好的做法是讓這個(gè)列表盡可能小,并且在單獨(dú)的測試中總是使用顯式j(luò)est.mock()/jest.unmock()調(diào)用。對于測試的其他讀者來說,明確的每個(gè)測試設(shè)置更容易推斷測試將運(yùn)行的環(huán)境。
通過jest.mock()在測試文件的頂部顯式調(diào)用,可以在單個(gè)測試中覆蓋此設(shè)置。
默認(rèn)值︰?false
?
指示是否應(yīng)在運(yùn)行期間報(bào)告每個(gè)單獨(dú)的測試。執(zhí)行后,所有錯(cuò)誤也仍將顯示在底部。請注意,如果只有一個(gè)測試文件正在運(yùn)行,它將默認(rèn)為true.
默認(rèn)值:?[]
?
在監(jiān)視模式下重新運(yùn)行測試之前,與所有源文件路徑匹配的 RegExp 模式數(shù)組。如果文件路徑與任何模式匹配,則在更新時(shí)不會觸發(fā)重新運(yùn)行測試。
這些模式與完整路徑匹配。使用<rootDir>字符串標(biāo)記包含項(xiàng)目根目錄的路徑,以防止它意外忽略不同環(huán)境中可能具有不同根目錄的所有文件。例子:?["<rootDir>/node_modules/"]
?。
即使此處未指定任何內(nèi)容,觀察者也會忽略對任何隱藏文件和目錄的更改,即以點(diǎn) ( .)開頭的文件和文件夾。
默認(rèn)值:?[]
?
此選項(xiàng)允許你使用自定義手表插件。在此處閱讀有關(guān)手表插件的更多信息。
手表插件的例子包括:
注意:?watchPlugins
?屬性值中的值可以省略?jest-watch-包名的前綴
?。
無默認(rèn)
此選項(xiàng)允許在?package.json
?. 將注釋文本作為該鍵的值包含在?package.json
?.
示例:
{
"name": "my-project",
"jest": {
"http://": "Comment goes here",
"verbose": true
}
}
更多建議: