5

我正在尝试组织一个新的 typescript 项目,该项目具有单元测试,也用 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. 

现在我在位于 resources/many/levels/schema.ts 的打字稿文件中有一个打字稿模块架构

我在一个打字稿文件中为 mocha 测试运行器编写了它的测试:test-resources/many/levels/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';

架构.ts:

module Schema  {

    export interface Schema {
        getName() : string;
        getColumnByIndex(index : number) : Column;
        getColumnById(id : string) : Column;
        getNumberOfColumns(): number;
    }

    export class SchemaFactory{
        ...
        build() : Schema {...}
    }
}  

我正在将我的测试和 src 文件编译到单个 dist 目录(不理想),并希望从那里运行测试。

我正在使用标志 --module commonjs 进行编译。

如果重要的话,我正在使用 IntelliJ 15 / WebStorm(并使用它的 mocha、node 和 tsc 插件)

我的 Schema 模块设置不正确吗?它应该是内部/外部模块吗?我的测试应该在同一个命名空间中吗?

提前致谢!

4

1 回答 1

5

我在设置茉莉花测试时遇到了这些问题,但基本上概念是相同的。问题源于这样一个事实:虽然相对路径引用是根据 .ts 文件的位置指定的,但在将代码编译到 dist 位置时不会维护该相对路径引用。以下是我如何解决这个问题。

  1. 将脚本和规范的编译分成两个不同的任务。我在构建过程中使用 gulp 任务,但如果您不使用 gulp,您仍然可以通过拥有一个单独的 tsconfig.json 来实现这一点,一个在资源文件夹中用于源代码编译,另一个 tsconfig.json 在资源测试文件夹中用于您的测试脚本编译。基本上,这会在逻辑上将您的源代码和测试脚本分离为两个不同的打字稿项目。

  2. 对于源代码的 typescript 编译,使用设置为 true 的声明编译器选项,以便获得 schema.d.ts 文件。该文件将在您的 schemaTest.ts 中被引用。为了让事情变得超级简单,有一个构建步骤,在编译源代码时,将从源代码编译生成的 .d.ts 和 .js 文件复制到 test-resources 文件夹中的特定文件夹(比如说 test-resources/compiledsource )。在这种情况下,compiledsource 文件夹将包含 schema.d.ts 和 schema.js 文件。

测试脚本 (schematests.ts) 中的导入语句将从compiledsource 文件夹中导入,如下所示

import {Schema, SchemaFactory} from './compiledsource/schema';

  1. 您的源代码编译和测试脚本编译应该分两步完成,第一步是源代码编译,这样当您的测试脚本编译时,您可以在已编译的源文件夹中获得 schema.d.ts,并且当您的测试运行架构时.js 将在compiledsource 文件夹中可用。

当 typescript 解释“import”语句时,它会寻找 .ts 或 .d.ts 文件,当它被编译成 javascript require 语句时,它会寻找 .js 文件。

于 2016-01-12T19:59:57.697 回答