javascript - 如何使用 ts_transformer_keys 正确配置 mocha 测试?

标签 javascript typescript mocha.js ts-node

我似乎无法通过我的 Mocha 测试为 ts-transform-keys 设置自定义转换器。

我使用的是 Mocha 6.1.4

ts-node 8.3.0 https://www.npmjs.com/package/ts-node

ts-transformer-keys 0.3.5 https://github.com/kimamula/ts-transformer-keys

ttypescript 1.5.7 https://github.com/cevek/ttypescript

ts-node 文档表示您无法在 CLI 上设置自定义转换器,只能通过编程方式设置。所以我尝试使用 ttypescript 来绕过这个限制。

我尝试过以下方法...

注意:test.ts 包含以下内容

import { keys } from 'ts-transformer-keys';

describe("xyz"), () => {
  it("123", (done) => {
     keys<CustomInterface>();
  });
});

尝试 1) - 使用环境变量设置 ts-node

TS_NODE_COMPILER="ttypescript"mocha test/test.ts --require ts-node/register

然后我在 test/tsconfig.json 中有以下内容

{
  "compilerOptions": {
    "plugins": [
      { "transform": "ts-transformer-keys/transformer" }
    ]
  }
}

这会导致Uncaught TypeError: ts_transformer_keys_1.keys is not a function,这表明在编译时未使用自定义转换器。

尝试 2)遵循 ts-transformer-keys 中的 typescript API 示例

我添加了一个 mocha.opts 文件,其中包含以下内容

--file test/transformer-config.js

和一个包含以下内容的 Transformer-config.js 文件

const ts = require('typescript');
const keysTransformer = require('ts-transformer-keys/transformer').default;

const program = ts.createProgram(['test/test.ts'], {
  strict: true,
  noEmitOnError: true,
  target: ts.ScriptTarget.ES5
});

const transformers = {
  before: [keysTransformer(program)],
  after: []
};
const { emitSkipped, diagnostics } = program.emit(undefined, undefined, undefined, false, transformers);

if (emitSkipped) {
  throw new Error(diagnostics.map(diagnostic => diagnostic.messageText).join('\n'));
}

然后我像这样调用它 mocha test/test.ts --require ts-node/register

这会导致以下错误


/Users/jjohnson/Documents/OCS/hmp/git/hmp-server/server/test/ttypescript-register.js:17
  throw new Error(diagnostics.map(diagnostic => diagnostic.messageText).join('\n'));
        ^
Error: [object Object]
[object Object]
[object Object]
    at Object.<anonymous> (/Users/jjohnson/Documents/OCS/hmp/git/hmp-server/server/test/ttypescript-register.js:17:9)
    at Module._compile (internal/modules/cjs/loader.js:777:30)
...

感觉在尝试 1 中,它从未调用在 tsconfig.json 中设置自定义转换器的代码,或者如果它被调用,则代码会默默地失败。

感觉就像在尝试 2 中我正在创建 typescript 程序的新实例,然后由于某种原因失败了。即使它成功了,我也不确定这是否是配置事物的正确方法,因为 ts.createProgram 需要一个它将要转换的文件的 RootNames 列表。

也许我的整个方法都是错误的。

我真正想要的是一种在我的 Mocha 测试中我可以验证预期结果类型是方法返回的类型的方法。我希望能够在不接触太多源代码的情况下完成此操作。

最佳答案

您应该能够定义所需的模块(见下文)并以编程方式运行 ts-node。这样,您就可以安全地使用任何客户变压器。

//tsnode.js

const transformer = require('ts-transformer-keys/transformer').default;
require("ts-node").register({
  transformers: program => ({
    before: [
      transformer(program)
    ]
  })
});

然后你可以使用 require 运行 mocha

mocha --require './tsnode.js' --watch-extensions ts,tsx "test/**/*.{ts,tsx}

关于javascript - 如何使用 ts_transformer_keys 正确配置 mocha 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58275660/

相关文章:

javascript - 在nodejs单元测试中使用mocha处理不同的响应

javascript - mocha javascript单元测试返回html字符串的函数

javascript - 单元测试 nodejs 事件

javascript - 如何将 Renderer text() 函数多次应用到 Highcharts 图表?

javascript - 在 React 中列出目录

typescript - 为什么 TypeScript 允许这样做?

angular - 无法从另一个项目访问 Typescript 文件 - 项目引用

javascript - 如何将背景颜色应用于选定的选项?

javascript - 在 promise 中,回调顺序是否有保证?

javascript - window.localStorage.setItem 未在 onkeydown 回调中执行