Sco*_*ott 6 javascript unit-testing jestjs
我正在尝试抑制 Jest 测试中的特定错误,因为我们计划稍后解决它,但在那之前我们不希望这些错误可能隐藏任何真正的错误。
这些错误发生在整个代码库中,因此我当前的策略是重新连接console.error我们的笑话设置文件中的函数。
我进行了两次不同的尝试,两者都几乎可以工作,但是现在当他们报告一个真正的错误时 - 他们在错误跟踪中添加了一个新行。
尝试1:
const originalError = console.error.bind(console.error);
jest.spyOn(global.console, 'error').mockImplementation((message) => {
if (
!message
.toString()
.includes(
'Warning: An update to SettingsPanel inside a test was not wrapped in act'
)
) {
originalError(message);
}
});
Run Code Online (Sandbox Code Playgroud)
尝试2:
const { error } = console;
global.console = {
...console,
error: (errorMessage) =>
!errorMessage
.toString()
.includes(
'Warning: An update to SettingsPanel inside a test was not wrapped in act'
) && error(errorMessage),
};
Run Code Online (Sandbox Code Playgroud)
这两个都会记录一个有效的错误 - 即“警告:列表中的每个子项都应该有一个唯一的“键”” -但是,它没有将我指向存在问题的代码,而是将我指向这里
console.error
Warning: Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/docs/lists-and-keys.html#keys for more information.%s
18 | .includes(
19 | 'Warning: An update to SettingsPanel inside a test was not wrapped in act'
> 20 | ) && error(errorMessage),
| ^
21 | };
at Object.error (jest.setup.js:20:12)
at printWarning (node_modules/react/cjs/react.development.js:315:30)
at error (node_modules/react/cjs/react.development.js:287:5)
at validateExplicitKey (node_modules/react/cjs/react.development.js:1630:5)
at validateChildKeys (node_modules/react/cjs/react.development.js:1656:9)
at Object.createElementWithValidation [as createElement] (node_modules/react/cjs/react.development.js:1806:7)
at src/js/components/SettingsPanel/DataListAutocompleter/DataListAutocompleter.tsx:85:13
Run Code Online (Sandbox Code Playgroud)
我搜索了又搜索,我能找到的只是有关消除所有错误或消除特定测试的问题 - 我发现没有任何东西可以帮助我解决这个问题。
failOnConsole在您的配置中使用setupFilesAfterEnv。您可以将其配置为消除某些错误,并让其他错误失败:
import failOnConsole from 'jest-fail-on-console'
failOnConsole({
silenceMessage: (errorMessage) => {
if (/'Warning: An update to .*? inside a test was not wrapped in act/.test(errorMessage)) {
return true
}
return false
},
})
Run Code Online (Sandbox Code Playgroud)
这应该会消除该错误的所有实例。其他一切都会经历,它会给你更多的行,但仍然应该保留错误的原始来源,在它添加的行下面。