我的源代码和测试分开如下:
`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)
答案 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/mocha
和import "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))