4

私はこれに少し立ち往生しています。静的な Web サイトを構築するために、仲介者、カルマ、ジャスミン、babeljs で構成される複雑なスタックがあります。

これは実験であることを考慮して、ES6 をモジュールで使用したいと考えました。仲買人側ではすべて問題ありませんが、カルマとジャスミンをテスト用にセットアップするのに苦労しています.

主な問題はバベル内にあります。バベルを使用するように設定すると、スペック内のすべてのモジュールをmodules: "ignore"手動で使用する必要があり、これは私が望んでいないことです。ES6 構文を使用したいのですが、 を設定すると、babeljs はすべてのテストを次のように にラップします。System.importmodules: "system"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 のマップ構成を準備し、アプリ ( http://localhost:4567にあります)からモジュールを正しくロードし、System.register ( http://localhost:9876にあります)にラップされたテストをロードできます。 .

ただし、私のテストは実行されておらず、エラーは報告されていません。さらに悪いことに、 「I'm here!!!」というメッセージが正しくログに記録されます。Mymoduleはコンソールに正しくログインしています。describeの値をログに記録しようとしましたが、これは正しくSuiteオブジェクトです。では、一体なぜ私のテストが実行されないのでしょうか? (itブロックは実行されません)

どのような解決策がありますか? セットアップを少し変更して動作させることは問題ありませんが、次のことを維持したいと思います: Middleman、ES6 モジュール、動的モジュールの読み込みなし(すべてのモジュールは最終的に単一のファイルで公開されるか、必須です)たくさんの<script>タグ付き)、ジャスミン

4

1 に答える 1

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 を実行します
于 2015-08-20T20:29:44.023 に答える