我如何测试在Node.js中使用命名空间的Typescript代码?

时间:2017-05-13 10:40:45

标签: typescript module namespaces mocha systemjs

我正在一个广泛使用命名空间的框架中编写一些Typescript代码。

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

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

我尝试使用--outFile,这迫使我使用systemjs作为模块加载器。我尝试过这样做,但是当我跑步时:

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

我收到错误:

ReferenceError: System is not defined

当我手动运行tsc来编译测试代码时,我确实看到对System.register的调用,但文件中实际上没有导入/要求系统。

我发现的最接近的例子就是这个回购:https://github.com/curran/jspm-mocha-example

它使用Babel而不是Typescript,但它似乎能够成功地将系统js与mocha一起使用,而且我没有看到加载系统库的显式代码。

更新

来自@martin我尝试将-r systemjs选项添加到mocha中。这添加了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);
                });
            });
        }
    };
});

2 个答案:

答案 0 :(得分: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,特别是beta分支

npm install jspm@beta

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

答案 1 :(得分:0)

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

无论如何mocha具有-rhttps://mochajs.org/#r---require-module-name)参数,在运行测试之前需要js文件。我不知道这是否可以直接从node_module目录导入SystemJS,或者你需要创建一个&#34; bootstrap&#34; js文件只需要SystemJS,因此您的模块可以使用它们。