在mocha中覆盖ts节点的`tsconfig.json`

时间:2016-11-16 15:29:01

标签: node.js mocha tsconfig

是否可以覆盖从mocha调用时tsconfig.json个ts节点使用的哪个?

我的主要tsconfig.json包含"module": "es2015",但我想仅将"module": "commonjs"用于ts节点。

我试过这个

mocha --compilers ts:ts-node/register,tsx:ts-node/register \
    --compilerOptions '{"module":"commonjs"}' \
    --require ts-node/register test/**/*.spec.ts*

但它不起作用:

SyntaxError: Unexpected token import
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Module.m._compile (/usr/lib/node_modules/ts-node/src/index.ts:406:23)
    at Module._extensions..js (module.js:422:10)
    at Object.require.extensions.(anonymous function) [as .tsx] (/usr/lib/node_modules/ts-node/src/index.ts:409:12)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Module.require (module.js:367:17)
    at require (internal/module.js:16:19)
    at /usr/lib/node_modules/mocha/lib/mocha.js:222:27
    at Array.forEach (native)
    at Mocha.loadFiles (/usr/lib/node_modules/mocha/lib/mocha.js:219:14)
    at Mocha.run (/usr/lib/node_modules/mocha/lib/mocha.js:487:10)
    at Object.<anonymous> (/usr/lib/node_modules/mocha/bin/_mocha:458:18)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:146:18)
    at node.js:404:3

8 个答案:

答案 0 :(得分:31)

您需要通过TS_NODE_COMPILER_OPTIONS环境变量

设置配置

unix机器上的示例代码:

TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' \
mocha --require ts-node/register 'test/**/*.spec.{ts,tsx}'

repository documentation

中提取的说明

CLI和程序化选项

括号中表示的环境变量。

  • --typeCheck启用TypeScript(TS_NODE_TYPE_CHECK
  • 的类型检查
  • --cacheDirectory配置输出文件缓存目录(TS_NODE_CACHE_DIRECTORY
  • -I, --ignore [pattern]覆盖路径模式以跳过编译(TS_NODE_IGNORE
  • -P, --project [path] TypeScript JSON项目文件(TS_NODE_PROJECT
  • 的路径
  • -C, --compiler [name]指定自定义TypeScript编译器(TS_NODE_COMPILER
  • -D, --ignoreDiagnostics [code]按诊断代码(TS_NODE_IGNORE_DIAGNOSTICS
  • 忽略TypeScript警告
  • -O, --compilerOptions [opts]要与编译器选项(TS_NODE_COMPILER_OPTIONS
  • 合并的JSON对象
  • --no-cache禁用本地TypeScript节点缓存(TS_NODE_CACHE
  • --skip-project跳过项目配置解析和加载(TS_NODE_SKIP_PROJECT
  • --skip-ignore跳过忽略检查(TS_NODE_SKIP_IGNORE

答案 1 :(得分:13)

--compilerOptions不会&#39;工作。

您需要做的是自定义注册ts-node的方式。我的情况与你的情况略有不同,我希望它使用test/tsconfig.json,其中包含我的测试代码所需的设置。如果我刚使用--require ts-node/register,则使用的默认配置不包含运行测试所需的设置。

我做的是:

  1. 创建文件test/tshook.js。它包含:

    require("ts-node").register({
      project: "test/tsconfig.json",
    });
    
  2. 我编辑了test/mocha.opts以获得:

    --require test/tshook.js
    test/**/*.ts
    
  3. 这应该将所需的设置传递给ts-node

    require("ts-node").register({
      compilerOptions: {
        module: "commonjs",
      },
    });
    

答案 2 :(得分:4)

在package.json - scripts部分:

"test": "TS_NODE_PROJECT=src mocha"

在项目的src目录中选取我的tsconfig.json,覆盖默认的tsconfig.json。

OP可以通过使用test而不是src来实现相同的功能

答案 3 :(得分:3)

虽然似乎没有统一的linux / windows命令行措辞有效,但是您可以从命令行设置compiler-options。就我而言,就像OP,我有一个tsconfig.json和一个module: esnext。我能够在命令行中进行覆盖:

在Windows上运行,{/ {1}}已全局安装,但使用不同的外壳类型:

bash / mingw64:
ts-node

cmd:
ts-node --compiler-options={"module":"commonJS"} xxx.ts

答案 4 :(得分:2)

这在Windows上对我有用

set TS_NODE_COMPILER_OPTIONS={\"module\":\"commonjs\"} && mocha -r ts-node/register test/unit/*.test.ts 

这是促使我使用该解决方案的错误

(function (exports, require, module, __filename, __dirname) { import 'mocha';

答案 5 :(得分:1)

Typescript允许您覆盖配置文件。而不是像其他解决方案中提到的那样在环境变量中对JSON进行硬编码,而要在环境中指定覆盖的配置路径。 TS_NODE_PROJECT环境变量可用于此目的。

TS_NODE_PROJECT='./tsconfig.commonjs.json'

因此,如果您的主要配置是:

tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
   }
}

您可以创建另一个覆盖module设置的配置。

tsconfig.commonjs.json

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "module": "commonjs"
  }
}

运行mocha时,请指定要使用的替代配置。

    "test": "TS_NODE_PROJECT='./tsconfig.commonjs.json' mocha -r ts-node/register test/**/*.spec.ts*"

这使得进一步定制tsconfig(仅用于摩卡测试)变得非常容易。您甚至可以直接在Mocha外部运行ts-node,指定该路径。

ts-node -P tsconfig.commonjs.json -r myFile.ts 

答案 6 :(得分:0)

在Mac上

"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",

答案 7 :(得分:0)

您还可以使用ts-mocha(https://www.npmjs.com/package/ts-mocha

示例

package.json

"test": "ts-mocha -p test/tsconfig.cjs.json test/**/*.test.ts"

test / tsconfig.cjs.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "module": "commonjs"
  }
}