2017-05-13 42 views
0

我在一个广泛使用名称空间的框架中编写一些Typescript代码。我将如何测试在Node.js中使用名称空间的Typescript代码?

我想添加一些单元测试,涉及使用像mocha这样的测试运行器,我将其作为模块加入。因为所有现有的文件都是用命名空间编写的,所以我无法将它们作为模块导入到我的测试中。

我可以使用/// <reference path=.../>,但引用的类实际上并未在编译的js文件中定义。

我试着用--outFile,这迫使我使用systemjs作为模块加载器。我试着这样做,但是当我运行:

mocha --compilers ts:ts-node/register api-test.ts 

我得到的错误:

ReferenceError: System is not defined 

当我手动运行tsc编译测试代码,我看到调用System.register但系统ISN实际上是在文件中导入/需要的。

我发现的最接近的例子是,回购协议:https://github.com/curran/jspm-mocha-example

它使用了巴贝尔,而不是打字稿,但它似乎能够成功地使用systemjs与摩卡,我没有看到明确的代码加载系统库。

更新:

从@马丁我尝试添加了-r systemjs选项摩卡。这增加了System并解决了参考错误。但是,接下来的问题是由Typescript编译器tsc生成的代码最终将测试代码封装在模块加载代码中。摩卡似乎现在无法找到测试。

System.register("tests/foo-test", ["config.js", "assert"], function (exports_1, context_1) { 
    "use strict"; 
    var __moduleName = context_1 && context_1.id; 
    var assert; 
    return { 
     setters: [ 
      function (_1) { 
      }, 
      function (assert_1) { 
       assert = assert_1; 
      } 
     ], 
     execute: function() { 
      describe('testCase', function() { 
       it('type test', function() { 
        assert(false); 
       }); 
      }); 
     } 
    }; 
}); 
+0

@martin -r标志有帮助,但是Typescript编译器现在隐藏了摩卡的测试。 – dragonx

回答

0

要导入这样的代码,则使用表格

import 'path/to/namespace'; 

SystemJS可加载如在https://github.com/systemjs/systemjs#nodejs描述具体

引述的文档的标准模块:

运行

npm install systemjs 

并将其添加到测试文件的顶部。

var SystemJS = require('systemjs'); 

// loads './app.js' from the current directory 
SystemJS.import('./app.js').then(function (m) { 
    console.log(m); 
}); 

如果使用JSPM,特别是测试版分支

npm install [email protected] 

您还可以使用jspm run module,它会自动加载,transpile,并使用指定的分辨率语义下的NodeJS执行目标模块本地jspm.config.js文件。

0

在使用--outFile的TypeScript中,让我们从您的所有源文件中制作一个“捆绑”,这仅受AMD和SystemJS模块格式支持。通常,在运行测试时,您不希望这样做,因为如果您想运行单个测试,则需要编译整个包。我也不认为mocha可以从软件包中导入单个模块并仅运行该模块。

总之mocha-rhttps://mochajs.org/#r---require-module-name)参数,该参数在运行测试之前需要js文件。我不知道这是直接通过从node_module目录导入SystemJS还是需要创建一个只需要SystemJS的“bootstrap”js文件,以便您的模块可以使用它们。

相关问题