typescript - 如何在 Jest 和 TypeScript 中处理未处理的拒绝
问题描述
错误
我不知道如何处理开源项目中未处理的拒绝。我有这种错误(已经有54个......):
(node:12836) UnhandledPromiseRejectionWarning: Error: Fake test error: send
(node:12836) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `
--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 54)
一个测试
记录上述消息的测试示例:
it(`should log about sending a message`, async (): Promise<void> => {
expect.assertions(3);
await expect(service.handleChannelMessage(anyDiscordMessage)).rejects.toThrow(new Error(`Fake test error: send`));
expect(loggerServiceDebugSpy).toHaveBeenCalledTimes(2);
expect(loggerServiceDebugSpy).toHaveBeenNthCalledWith(2, {
context: `DiscordMessageService`,
extendedContext: true,
message: `context-[dummy-id] text-sending message...`,
} as ILoggerLog);
});
我认为这种带有 await 和 rejects.toThrow 的特定语法是捕捉它们的好方法,我尝试了其他语法(例如,我不喜欢并且默认 linter 配置不推荐的一些语法)但无论如何我仍然找不到一种不让 Jest 为此哭泣的方法。
笑话
我运行命令npm run jest --watchAll --unhandled-rejections=strict
开始测试。
如果这很有用,这里是 Jest 配置:
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html
module.exports = {
// All imported modules in your tests should be mocked automatically
automock: false,
// Stop running tests after `n` failures
bail: false,
// Respect "browser" field in package.json when resolving modules
// browser: false,
cache: true,
// The directory where Jest should store its cached dependency information
cacheDirectory: `./.cache-jest`,
// Automatically clear mock calls and instances between every test
clearMocks: true,
// Indicates whether the coverage information should be collected while executing the test
collectCoverage: false,
// An array of glob patterns indicating a set of files for which coverage information should be collected
// collectCoverageFrom: undefined,
// The directory where Jest should output its coverage files
coverageDirectory: `coverage`,
// An array of regexp pattern strings used to skip coverage collection
// coveragePathIgnorePatterns: [
// "\\\\node_modules\\\\"
// ],
// A list of reporter names that Jest uses when writing coverage reports
coverageReporters: [`json`, `text-summary`, `lcov`],
// An object that configures minimum threshold enforcement for coverage results
// coverageThreshold: undefined,
// A path to a custom dependency extractor
// dependencyExtractor: undefined,
displayName: {
color: `magenta`,
name: `Sonia`,
},
// Make calling deprecated APIs throw helpful error messages
errorOnDeprecated: true,
// Force coverage collection from ignored files using an array of glob patterns
// forceCoverageMatch: [],
// A path to a module which exports an async function that is triggered once before all test suites
// globalSetup: undefined,
// A path to a module which exports an async function that is triggered once after all test suites
// globalTeardown: undefined,
// A set of global variables that need to be available in all test environments
globals: {
"ts-jest": {
compiler: `ttypescript`,
},
},
// The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
// maxWorkers: "50%",
maxConcurrency: 5,
// An array of directory names to be searched recursively up from the requiring module's location
moduleDirectories: [`./node_modules`],
// A map from regular expressions to module names that allow to stub out resources with a single module
// moduleNameMapper: {},
// An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
// modulePathIgnorePatterns: [],
// An array of file extensions your modules use
moduleFileExtensions: [`js`, `json`, `ts`, `node`],
// Activates notifications for test results
notify: true,
// An enum that specifies notification mode. Requires { notify: true }
notifyMode: `failure-change`,
// Run tests from one or more projects
// projects: undefined,
// A preset that is used as a base for Jest's configuration
preset: `ts-jest/presets/js-with-ts`,
prettierPath: `prettier`,
// Use this configuration option to add custom reporters to Jest
reporters: [
[
`jest-silent-reporter`,
{
showPaths: true,
showWarnings: true,
useDots: true,
},
],
],
// Automatically reset mock state between every test
resetMocks: true,
// A path to a custom resolver
// resolver: undefined,
// Reset the module registry before running each individual test
resetModules: false,
// The root directory that Jest should scan for tests and modules within
// rootDir: undefined,
// Automatically restore mock state between every test
restoreMocks: true,
// Allows you to use a custom runner instead of Jest's default test runner
// runner: "jest-runner",
// A list of paths to directories that Jest should use to search for files in
roots: [`./src`, `./scripts`],
// The paths to modules that run some code to configure or set up the testing environment before each test
setupFiles: [`./config.ts`],
// A list of paths to snapshot serializer modules Jest should use for snapshot testing
// snapshotSerializers: [],
// Prevent tests from printing messages through the console
silent: true,
// A list of paths to modules that run some code to configure or set up the testing framework before each test
// setupFilesAfterEnv: [`./__tests__/setup.js`],
// The test environment that will be used for testing
testEnvironment: `node`,
// Options that will be passed to the testEnvironment
// testEnvironmentOptions: {},
// Adds a location field to test results
// testLocationInResults: false,
// The glob patterns Jest uses to detect test files
// testMatch: [
// "**/__tests__/**/*.[jt]s?(x)",
// "**/?(*.)+(spec|test).[tj]s?(x)"
// ],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
// testPathIgnorePatterns: [
// "\\\\node_modules\\\\"
// ],
// The regexp pattern or array of patterns that Jest uses to detect test files
// testRegex: [],
// This option allows the use of a custom results processor
// testResultsProcessor: undefined,
// This option allows use of a custom test runner
// testRunner: "jasmine2",
// This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
// testURL: "http://localhost",
testTimeout: 5000,
// Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
timers: `fake`,
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
// transformIgnorePatterns: [
// "\\\\node_modules\\\\"
// ],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
// A map from regular expressions to paths to transformers
transform: {
".ts": `ts-jest`,
},
// An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
// watchPathIgnorePatterns: [],
// Indicates whether each individual test should be reported during the run
verbose: true,
// Whether to use watchman for file crawling
watchman: true,
};
依赖项
jest: 26.1.0
ts-jest: 26.1.1
存储库
如果有人需要一个真实的案例测试示例,该项目在 GitHub 上是公开的。
谢谢!
解决方案
推荐阅读
- java - 处理 RequestRejectedException - ExceptionLoggingFilter
- angular - 使用等待更新大量项目,我怎样才能加快速度?
- c# - 转换后泛型方法内的 C# 匿名对象属性
- javascript - 更改禁用的 Material UI 复选框颜色或背景颜色
- machine-learning - 关于使用 cross_val_score 进行预测的工作流程
- r - rowwise() 与 dplyr 中的列名向量求和
- sql-server - 设置多个 XMLNAMESPACES 以在 SQL 查询中说明不同版本的 SSRS/SQL
- javascript - 数组属性的传单层控件弄乱了结果,如何解决?大量geoJSON数据和几个过滤器的更好解决方案?
- python - 生成的类在 Python 上有冲突
- javascript - wikiitude:未捕获的建筑师错误:属性 rotate.z 不可动画