使用 Mocha 设置 TypeScript 单元测试

setting up TypeScript unit tests with Mocha

我正在尝试组织一个新的 typescript 项目,它有单元测试,也是用 TS 编写的,运行在 Mocha 测试中 运行ner。

我的项目具有以下目录约定:

/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 测试 运行ner 编写,在一个打字稿文件中: 测试-resources/many/levels/schemaTest.ts

问题是打字稿编译器无法使用以下导入语法找到模式模块:

TC2307 Can't find module schema

架构Test.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');

架构Test.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 {...}
    }
}  

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

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

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

我的架构模块设置不正确吗?它应该是一个 internal/external 模块吗?我的测试应该在同一个命名空间中吗?

提前致谢!

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

  1. 将脚本和规范的编译分成两个不同的任务。我在我的构建过程中使用了 gulp 任务,但是如果你没有使用 gulp,你仍然可以通过单独的 tsconfig.json 来实现这一点,一个在资源文件夹中用于你的源代码编译和resources-test 文件夹中的另一个 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) 中的导入语句将从编译源文件夹中导入,如下所示

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

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

When typescript interprets "import" statement, it will look for the .ts or .d.ts file and when it is compiled to javascript require statement, it will look for the .js file.