使用Mocha设置TypeScript单元测试

时间:2016-01-12 16:13:14

标签: unit-testing typescript mocha webstorm intellij-15

我正在尝试组织一个新的打字稿项目,该项目具有在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的插件)

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

提前致谢!

1 个答案:

答案 0 :(得分:4)

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

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

  2. 对于源代码的打字稿编译,请使用声明编译器选项设置为true,以便获得schema.d.ts文件。此文件将在schemaTest.ts中引用。为了使事情变得非常容易,有一个构建步骤,当编译源时,将源编译生成的.d.ts和.js文件复制到test-resources文件夹中的特定文件夹(比如test-resources / compiledsource) )。在这种情况下,compiledsource文件夹将具有schema.d.ts和schema.js文件。

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

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

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

      当typescript解释“import”语句时,它会查找   .ts或.d.ts文件以及何时编译为javascript require   声明,它将查找.js文件。