node.js - 如何在 Jest 的自定义测试环境文件中使用 TypeScript?
问题描述
我需要为我的测试启用一些全局变量,因此我正在设置一个自定义环境以testEnvironment
在我的选项中使用jest.config.json
以实现这一目标。
对于我们的项目,我们有一个用于setupFilesAfterEnv
选项的 TypeScript 文件,它工作得很好,但testEnvironment
似乎只支持 ES5。有没有办法在这样的选项中使用 TypeScript?
我使用 ES5 语法成功创建了自定义 Jest 环境,但是由于我们正在注入全局变量,我需要 TypeScript 来声明全局命名空间,请参见:https ://stackoverflow.com/a/42304473/4655076 。
{
///...
setupFilesAfterEnv: ['<rootDir>/test/setup.ts'], // This works with ts
testEnvironment: '<rootDir>/test/customJestEnvironment.ts', // This doesn't work with ts
}
解决方案
我通过使用ts-node和以下命令解决了这个问题:
node -r ts-node/register ./node_modules/jest/bin/jest.js
这实质上是即时编译打字稿,以便 jest 接收发出的 javascript,而无需实际将打字稿源编译为 js。
您需要启用esModuleInterop
TS 编译器选项才能正常工作。
测试环境.ts
import NodeEnvironment from 'jest-environment-node';
import type {Config} from '@jest/types';
class TestEnvironment extends NodeEnvironment {
constructor(config: Config.ProjectConfig) {
super(config);
// this.testPath = context.testPath;
// this.docblockPragmas = context.docblockPragmas;
}
public async setup(): Promise<void> {
await super.setup();
console.log('SETTING UP...');
// 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') {
// // ...
// }
}
public async teardown(): Promise<void> {
await super.teardown();
console.log('TEARING DOWN!');
// this.global.someGlobalObject = destroyGlobalObject();
// await someTeardownTasks();
}
}
export default TestEnvironment;
但是,此解决方案将破坏 globalSetup - 如果您使用jest-ts
.