使用mocha和ts-node运行位于单独目录中的测试?

时间:2017-05-01 14:10:41

标签: node.js typescript mocha typescript2.0 ts-node

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

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

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

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文件可以使用语句hello

导入import hello from 'hello';

我正在尝试运行配置为运行mocha和tsnode的npm test的测试(基于this article):

"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)

1 个答案:

答案 0 :(得分:1)

您在tsconfig.json中通过ts-node设置的模块分辨率纯粹是编译时的事情。 (有关详细信息,请参阅此require("hello") issue report和此TypeScript issue report。)它不会影响代码的发布方式,这意味着您的测试文件正在执行paths,哪个Node无法解析。 tsconfig.json是编译时的结果是你的模块加载器需要配置为执行你在paths中指定的相同类型的解析。例如,如果您使用的是RequireJS,则需要为其配置tsconfig.json tsconfig.json中的相同内容。您正在使用Node,但是......

您可以在Node中执行的操作是使用tsconfig-paths,它将读取paths,解析hello.spec.ts设置并更改Node中的模块分辨率以使其正常工作。

使用您的代码,我修改了import hello from "hello"; import "mocha"; it("q", () => { if (hello() !== "Hello World!") { throw new Error("unequal"); } }); 以至少有一个反馈测试:

tsconfig-paths

我安装了@types/mochaimport "mocha"(以便$ ./node_modules/.bin/mocha --compilers ts:ts-node/register -r tsconfig-paths/register 'src/test/ts/**/*.ts' 在我上面显示的测试文件中正确编译)并像这样调用Mocha:

  ✓ q

  1 passing (20ms)

我得到了这个输出:

from nltk.corpus import shakespeare #XMLCorpusreader
shakespeare.fileids()
['a_and_c.xml', 'dream.xml', 'hamlet.xml', 'j_caesar.xml', ...]

play = shakespeare.xml('dream.xml') #ElementTree object
print(play)
<Element 'PLAY' at ...>

for i in range(9):
    print('%s: %s' % (play[i].tag, play[i].text))