我正在尝试组织一个新的打字稿项目,该项目具有在TS中编写的单元测试,在Mocha测试运行器中运行。
我的项目具有以下目录约定:
/project/src/ for server-side code (java)
/project/test/ server's tests
/project/resources/ client-side code (typescript)
/project/test-resources/ typescript tests.
现在我在types / many / levels / schema.ts中的typescript文件中有一个打字稿模块Schema
我在一个打字稿文件中为mocha测试运行器编写了测试: 测试资源/多/水平/ schemaTest.ts
问题是,打字稿编译器无法使用以下导入语法找到架构模块:
TC2307无法找到模块架构
schemaTest.ts(版本1):
/// <reference path="../typings/mocha/mocha.d.ts" />
/// <reference path="../typings/chai/chai.d.ts" />
/// <reference path="../../../resources/many/levels/schema.ts" />
import s = require('schema');
schemaTest.ts(版本2):
/// <reference path="../typings/mocha/mocha.d.ts" />
/// <reference path="../typings/chai/chai.d.ts" />
/// <reference path="../../../resources/many/levels/schema.ts" />
import {Schema, SchemaFactory} from 'schema';
最后,以下版本编译但导致运行时错误,因为模块不在../../../resources/many/level,而是位于dist目录中
/// <reference path="../typings/mocha/mocha.d.ts" />
/// <reference path="../typings/chai/chai.d.ts" />
/// <reference path="../../../resources/many/levels/schema.ts" />
import {Schema, SchemaFactory} from '../../../resources/many/levels/schema';
schema.ts:
module Schema {
export interface Schema {
getName() : string;
getColumnByIndex(index : number) : Column;
getColumnById(id : string) : Column;
getNumberOfColumns(): number;
}
export class SchemaFactory{
...
build() : Schema {...}
}
}
我正在将我的test和src文件编译到单个dist目录(不理想),并希望从那里运行测试。
我正在使用标志--module commonjs进行编译。
如果重要,我使用的是IntelliJ 15 / WebStorm(并使用mocha,node和tsc的插件)
我的架构模块设置不正确吗?它应该是内部/外部模块吗?我的测试应该在同一名称空间中吗?
提前致谢!
答案 0 :(得分:4)
我在设置茉莉花测试时遇到过这些问题,但从根本上说这些概念是相同的。问题源于这样的事实:虽然基于.ts文件的位置指定了相对路径引用,但是当代码被编译到dist位置时,不保持该相对路径引用。以下是我如何解决这个问题。
将脚本和规范的编译分为两个不同的任务。我正在为构建过程使用gulp任务但是如果你没有使用gulp,你仍然可以通过一个单独的tsconfig.json实现这一点,一个在资源文件夹中用于源代码编译,另一个用于资源测试文件夹中的tsconfig.json为您的测试脚本编译。基本上,这会将源代码和测试脚本逻辑地分成两个不同的打字稿项目。
对于源代码的打字稿编译,请使用声明编译器选项设置为true,以便获得schema.d.ts文件。此文件将在schemaTest.ts中引用。为了使事情变得非常容易,有一个构建步骤,当编译源时,将源编译生成的.d.ts和.js文件复制到test-resources文件夹中的特定文件夹(比如test-resources / compiledsource) )。在这种情况下,compiledsource文件夹将具有schema.d.ts和schema.js文件。
测试脚本中的import语句(schematests.ts)将从compiledsource文件夹导入,如下所示
import {Schema, SchemaFactory} from './compiledsource/schema';
当typescript解释“import”语句时,它会查找 .ts或.d.ts文件以及何时编译为javascript require 声明,它将查找.js文件。