使用 mocha 和 ts-node 运行位于单独目录中的测试?
Posted
技术标签:
【中文标题】使用 mocha 和 ts-node 运行位于单独目录中的测试?【英文标题】:Running tests located in a separate directory with mocha and ts-node? 【发布时间】:2017-09-28 22:49:03 【问题描述】:我将源代码和测试分开如下:
`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
文件可以使用语句import hello from 'hello';
导入hello
我正在尝试使用 npm test
运行测试,配置为像这样运行 mocha 和 tsnode(基于 this article):
"scripts":
"test": "mocha -r ts-node/register src/test/ts"
,
但是,当我收到此错误时,似乎 ts-node 并没有在我的 tsconfig.json
配置上运行:
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】:您在tsconfig.json
中通过paths
设置的模块分辨率纯粹是编译时的事情。 (有关详细信息,请参阅此 ts-node
issue report 和此 TypeScript issue report。)它不会影响代码的发出方式,这意味着您的测试文件正在执行 require("hello")
,这是 Node 无法解析的。 paths
是编译时事物的结果是您的模块加载器需要配置为也执行您在tsconfig.json
中指定的相同类型的分辨率。例如,如果您使用的是 RequireJS,您需要为它配置一个与 paths
和 tsconfig.json
相同的配置。但是,您正在使用 Node...
您可以在 Node 中做的是使用 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-paths
和@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)
【讨论】:
以上是关于使用 mocha 和 ts-node 运行位于单独目录中的测试?的主要内容,如果未能解决你的问题,请参考以下文章
mocha 和 ts-node 找不到本地 .d.ts 文件
mocha 和 ts-node UnhandledPromiseRejectionWarning:TypeError: Cannot convert undefined or null to obje