如何设置Karma + Jasmine以使用ES6模块

时间:2015-08-18 16:08:34

标签: javascript jasmine karma-runner babeljs systemjs

我有点卡在这上面。我有一个由中间人,业力,茉莉,babeljs组成的复杂堆栈来构建一个静态网站。

考虑到这是一个实验,我想将ES6与模块一起使用。尽管如此,在中间人的一切都很好,我很难设置业力+茉莉花进行测试。

主要问题在于babel:如果您将其设置为使用modules: "ignore",则必须在规范中手动使用System.import 所有您的模块,这是我的问题不想要。我想使用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中)正确加载模块,并在System.register(位于http://localhost:9876)。

但是,我的测试未运行,未报告错误。更糟糕的是,我正确地记录了消息"我在这里!!!" 和Mymodule正确登录到控制台。我甚至尝试记录 describe 的值,并且它正确地记录了 Suite 对象。那么,为什么我的测试没有运行呢? (永远不会运行it块)

我有什么解决方案?我可以稍微更改设置以使其正常工作,但我想保留以下内容:Middleman,ES6模块,无动态模块加载(我的所有模块都暴露在内,最后,在一个文件中或需要一堆<script>标签),jasmine

1 个答案:

答案 0 :(得分:2)

我终于解决了这个问题。我将此文件列为最后一个

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()

它做了以下事情:

  • 临时禁用业力启动功能,将其替换为空的
  • 获取存储在System.register中的每个测试,运行System.import进行所有测试(等待Promise.all
  • 完成所有导入后,它会附加__karma__start并执行它,运行Jasmine