首页 > 解决方案 > 如何在 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
}

标签: node.jstypescriptjestjs

解决方案


我通过使用ts-node和以下命令解决了这个问题:

node -r ts-node/register ./node_modules/jest/bin/jest.js

这实质上是即时编译打字稿,以便 jest 接收发出的 javascript,而无需实际将打字稿源编译为 js。

您需要启用esModuleInteropTS 编译器选项才能正常工作。

测试环境.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.


推荐阅读