首页 > 解决方案 > 如何在不发出 js 文件的情况下用 jest 测试非导出的打字稿函数

问题描述

我有一些我想开玩笑测试的非导出函数。在 JavaScript 中,我会使用rewire。为了使用 rewire 测试 TypeScript,您将rewire()调用指向发出的 JavaScript 文件而不是 TypeScript 文件。

但是,我使用 webpack 来编译我的 TS,所以在我的 tsconfig.json 中,我有{ compilerOptions: { noEmit: true } },并且没有发出的文件指向 rewire。

如何测试我的非导出函数?

标签: typescriptunit-testingjestjs

解决方案


我想出了一个不太理想但比导出更好的解决方法。

jest.config.js

module.exports = {
  // ...
  globals: {
    TEST: true,
    // ...
  }
};

全球.d.t​​s

export {};
declare global {
  const TEST: boolean;
  // ...
}

webpack.config.js

const { DefinePlugin } = require('webpack');
module.exports = {
  // ...
  plugins: [
    new DefinePlugin({ TEST: 'false' })
  ]
};

我的模块.ts

function myNonExportedFunction() {
  // ...
}

if (TEST) {
  module.exports.myNonExportedFunction = myNonExportedFunction;
}

__tests__/module.ts

const { myNonExportedFunction } = require('../my-module');

test('myNonExportedFunction', () => {
  // ...
});

这种方法的两个缺点是:

  1. 您在生产代码中包含最少的测试代码(尽管 webpack 可以删除基于常量的代码)

  2. 你失去了你的非导出函数的强类型,尽管你失去了重新连接的类型安全性


推荐阅读