我正在一个广泛使用命名空间的框架中编写一些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);
});
});
}
};
});
答案 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
具有-r
(https://mochajs.org/#r---require-module-name)参数,在运行测试之前需要js
文件。我不知道这是否可以直接从node_module
目录导入SystemJS,或者你需要创建一个&#34; bootstrap&#34; js
文件只需要SystemJS,因此您的模块可以使用它们。