如何设置 Karma + Jasmine 以使用 ES6 模块
How to setup Karma + Jasmine to use ES6 modules
我有点卡在这上面。我有一个由 middleman, karma, jasmine, babeljs 组成的复杂堆栈来构建一个静态网站。
考虑到这是一个实验,我想将 ES6 与模块一起使用。中间人方面一切都很好,但是,我很难设置 karma + jasmine 进行测试。
主要问题在于 babel:如果你将它设置为使用 modules: "ignore"
,你必须手动使用 System.import
用于 all 你的规范中的模块,这是我不想要的。我想使用 ES6 语法,但如果我设置 modules: "system"
,babeljs 会将我所有的测试包装到 System.register
,类似以下内容:
System.register(["mymodule"], function (_export) {
"use strict";
var Mymodule;
return {
setters: [function (_mymodule) {
Mymodule = _mymodule["default"];
}],
execute: function () {
console.log("I'm here!!!");
console.log(Mymodule);
describe("Mymodule", function () {
it("has version", function () {
expect(Mymodule.VERSION).toEqual("1.0.0");
});
});
}
};
});
所以测试不会自动执行。然后我创建了以下脚本来解决它(包含所有规格后包含):
basePath = "/base/spec/"
modules = []
for own fileName, fileHash of window.__karma__.files
if fileName.indexOf(basePath) is 0
isRunner = fileName.indexOf("spec_runner") >= 0
isRunner ||= fileName.indexOf("spec_helper") >= 0
unless isRunner
moduleName = fileName.replace(basePath, "")
moduleName = moduleName.replace(".js", "")
modules.push(path: fileName, name: moduleName)
mappedModules = {}
baseSpecsPath = "http://localhost:9876"
for module in modules
mappedModules[module.name] = baseSpecsPath + module.path
System.config
baseURL: "http://localhost:4567/javascripts/"
map: mappedModules
for module in modules
System.import(module.name)
这段代码很简单:它为 SystemJS 准备了 map 配置,我可以从我的应用程序(位于 http://localhost:4567) and tests wrapped in System.register (located in http://localhost:9876)中正确加载模块。
但是,我的测试没有运行,并且没有报告错误。更糟糕的是,我正确地记录了消息 "I'm here!!!" 并且 Mymodule 正确地记录在控制台中。我什至尝试记录 describe 的值,它正确地是一个 Suite 对象。那么,到底为什么我的测试不是 运行? (it
块永远不会是 运行)
我有什么解决办法?我可以稍微更改设置以使其正常工作,但我想保留以下内容:中间人、ES6 模块、无动态模块加载(我所有的模块都已公开,最后,在单个文件中或需要一堆 <script>
标签),jasmine
我终于解决了这个问题。我将此文件 作为最后一个 :
basePath = "/base/spec/"
modules = []
for own fileName, fileHash of window.__karma__.files
if fileName.indexOf(basePath) is 0
isRunner = fileName.indexOf("spec_runner") >= 0
isRunner ||= fileName.indexOf("spec_helper") >= 0
unless isRunner
moduleName = fileName.replace(basePath, "")
moduleName = moduleName.replace(".js", "")
modules.push(path: fileName, name: moduleName)
mappedModules = {}
baseSpecsPath = "http://localhost:9876"
specModules = []
for module in modules
mappedModules[module.name] = baseSpecsPath + module.path
specModules.push(module.name)
System.config
baseURL: "http://localhost:4567/javascripts/"
map: mappedModules
moduleImports = specModules.map (moduleName) ->
System.import(moduleName)
Promise.all(moduleImports).then ->
window.__karma__.start = window.__lastKarmaStart__
window.__lastKarmaStart__ = null
delete window.__lastKarmaStart__
window.__karma__.start()
它执行以下操作:
- 暂时禁用 karma 启动功能,用一个空的替换它
- 为所有测试获取存储在
System.register
、运行 System.import
中的每个测试(用 Promise.all
等待它们)
- 所有导入完成后,附加回
__karma__start
并执行,运行ning Jasmine
我有点卡在这上面。我有一个由 middleman, karma, jasmine, babeljs 组成的复杂堆栈来构建一个静态网站。
考虑到这是一个实验,我想将 ES6 与模块一起使用。中间人方面一切都很好,但是,我很难设置 karma + jasmine 进行测试。
主要问题在于 babel:如果你将它设置为使用 modules: "ignore"
,你必须手动使用 System.import
用于 all 你的规范中的模块,这是我不想要的。我想使用 ES6 语法,但如果我设置 modules: "system"
,babeljs 会将我所有的测试包装到 System.register
,类似以下内容:
System.register(["mymodule"], function (_export) {
"use strict";
var Mymodule;
return {
setters: [function (_mymodule) {
Mymodule = _mymodule["default"];
}],
execute: function () {
console.log("I'm here!!!");
console.log(Mymodule);
describe("Mymodule", function () {
it("has version", function () {
expect(Mymodule.VERSION).toEqual("1.0.0");
});
});
}
};
});
所以测试不会自动执行。然后我创建了以下脚本来解决它(包含所有规格后包含):
basePath = "/base/spec/"
modules = []
for own fileName, fileHash of window.__karma__.files
if fileName.indexOf(basePath) is 0
isRunner = fileName.indexOf("spec_runner") >= 0
isRunner ||= fileName.indexOf("spec_helper") >= 0
unless isRunner
moduleName = fileName.replace(basePath, "")
moduleName = moduleName.replace(".js", "")
modules.push(path: fileName, name: moduleName)
mappedModules = {}
baseSpecsPath = "http://localhost:9876"
for module in modules
mappedModules[module.name] = baseSpecsPath + module.path
System.config
baseURL: "http://localhost:4567/javascripts/"
map: mappedModules
for module in modules
System.import(module.name)
这段代码很简单:它为 SystemJS 准备了 map 配置,我可以从我的应用程序(位于 http://localhost:4567) and tests wrapped in System.register (located in http://localhost:9876)中正确加载模块。
但是,我的测试没有运行,并且没有报告错误。更糟糕的是,我正确地记录了消息 "I'm here!!!" 并且 Mymodule 正确地记录在控制台中。我什至尝试记录 describe 的值,它正确地是一个 Suite 对象。那么,到底为什么我的测试不是 运行? (it
块永远不会是 运行)
我有什么解决办法?我可以稍微更改设置以使其正常工作,但我想保留以下内容:中间人、ES6 模块、无动态模块加载(我所有的模块都已公开,最后,在单个文件中或需要一堆 <script>
标签),jasmine
我终于解决了这个问题。我将此文件 作为最后一个 :
basePath = "/base/spec/"
modules = []
for own fileName, fileHash of window.__karma__.files
if fileName.indexOf(basePath) is 0
isRunner = fileName.indexOf("spec_runner") >= 0
isRunner ||= fileName.indexOf("spec_helper") >= 0
unless isRunner
moduleName = fileName.replace(basePath, "")
moduleName = moduleName.replace(".js", "")
modules.push(path: fileName, name: moduleName)
mappedModules = {}
baseSpecsPath = "http://localhost:9876"
specModules = []
for module in modules
mappedModules[module.name] = baseSpecsPath + module.path
specModules.push(module.name)
System.config
baseURL: "http://localhost:4567/javascripts/"
map: mappedModules
moduleImports = specModules.map (moduleName) ->
System.import(moduleName)
Promise.all(moduleImports).then ->
window.__karma__.start = window.__lastKarmaStart__
window.__lastKarmaStart__ = null
delete window.__lastKarmaStart__
window.__karma__.start()
它执行以下操作:
- 暂时禁用 karma 启动功能,用一个空的替换它
- 为所有测试获取存储在
System.register
、运行System.import
中的每个测试(用Promise.all
等待它们) - 所有导入完成后,附加回
__karma__start
并执行,运行ning Jasmine