1

我将源代码和测试分开如下:

`src/main/ts/hello.ts`  //SOURCE FILES HERE
`src/test/ts/hello.spec.ts` //SPEC FILES HERE

中的导入语句src/test/ts/hello.spec.ts如下所示:

import hello from 'hello';

hello.ts源代码如下所示:

    export function hello() {
      return 'Hello World!';
    }

    export default hello;

tsconfig.json的设置使得测试文件可以在不使用相对路径的情况下导入源模块,如下所示:

    {
       "include": [
         "src/main/ts/**/*.ts"
       ],
       "exclude": [
         "node_modules"
       ],

       "compilerOptions": {
         "experimentalDecorators": true,
         "noImplicitAny": true,
         "moduleResolution": "node",
         "target": "es6",
         "baseUrl": ".",
         "paths": {
           "*": [
             "*", "src/main/ts/*"
           ]
         }
       }
     }

这样文件可以使用语句hello.spec.ts导入helloimport hello from 'hello';

我正在尝试运行npm test配置为像这样运行 mocha 和 tsnode 的测试(基于这篇文章):

"scripts": {
  "test": "mocha -r ts-node/register src/test/ts"
},

tsconfig.json但是,当我收到此错误时,它看起来不像 ts-node 正在接受我的配置:

mocha -r ts-node/register src/test/ts

Error: Cannot find module 'hello'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:286:25)
4

1 回答 1

4

paths您设置的模块分辨率tsconfig.json纯粹是编译时的事情。(有关详细信息,请参阅此ts-node 问题报告和此 TypeScript问题报告。)它不会影响代码的发出方式,这意味着您的测试文件正在执行一个require("hello")Node 无法解决的问题。作为编译时事物的结果paths是您的模块加载器需要配置为执行您在tsconfig.json. 例如,如果您使用的是 RequireJS,那么您需要对其进行配置来执行相同的paths操作tsconfig.json。您正在使用 Node,但是...

您可以在 Node 中做的是 use tsconfig-paths,它将读取tsconfig.json、解析paths设置并更改 Node 中的模块分辨率以使其正常工作。

使用您的代码,我修改hello.spec.ts为至少进行一项反馈测试:

import hello from "hello";
import "mocha";

it("q", () => {
    if (hello() !== "Hello World!") {
        throw new Error("unequal");
    }
});

我安装了tsconfig-pathsand @types/mocha(这样import "mocha"在我上面显示的测试文件中编译正确)并像这样调用 Mocha:

$ ./node_modules/.bin/mocha --compilers ts:ts-node/register -r tsconfig-paths/register 'src/test/ts/**/*.ts'

我得到了这个输出:

  ✓ q

  1 passing (20ms)
于 2017-05-01T14:55:13.390 回答