2

最近RequireJSを導入したばかりのプロジェクトがあります。RequireJSの前は、Jasmineでプロジェクトをテストしていました。現在、JasmineのSpecRunnerを更新して、RequireJSを処理できるようにしようとしています。

この記事は、私が始めたときに使用したRequireJSとJasmineを使用した単体テストに関する記事でした。モジュールのロード方法に問題が発生しました。各モジュールは、依存関係がある他のモジュールを定義しますが、各モジュールのロードパスは、requireJSがロードされた場所を基準にしています。

requireJSをbackground.htmlとSpecRunner.htmlの2つの異なる場所にロードします。背景はメインアプリケーション用で、SpecRunnerはテスト用です。問題は、相対パスが変更されるため、SpecRunnerから呼び出されたときにモジュールをロードできないことです。

例:

このフォルダ階層とファイルを使用して、2つのシナリオがあります。コードが正しく実行されるものと問題があるもの:

良いシナリオ

  • background.htmlはrequire.jsをロードし、ロードポイントとしてplayer.jsをターゲットにして実行します。
  • player.jsは、playlists.jsを依存関係として定義しています。
  • playlists.jsが読み込まれます。
  • player.jsが読み込まれます。

悪いシナリオ

  • SpecRunner.htmlはrequire.jsをロードし、ロードポイントとしてplayer.jsをターゲットにして実行します。
  • player.jsは、playlists.jsを依存関係として定義しています。
  • playlists.jsの読み込みに失敗します。GET file://tests/playlists.js
    • ファイルの場所が正しくありません。playlists.jsは/testsの下ではなく、js/backgroundの下にあります。

これをどのように処理すればよいかわかりませんか?パス名を非常に明示的にすることが私の唯一の方法のようですが、それはすべてのrequireJSの例に反します。

4

1 に答える 1

4

requireのパスは、data-mainの場所、またはを呼び出した関数の場所に相対的require()です。あなたの良いシナリオではこれはjs/background/であり、あなたの悪いシナリオではこれはtests/です。リンクしたブログでは、require.pathsを使用してこれを適切に機能させます。

<!--
    Since we are in the "test" directory, not in the standard
    "js" directory, we need to define the path prefix' for the
    RequireJS modules so that the modules can be found from the
    tests running in the Spec directory.
-->
<script type="text/javascript">

    var require = {
        paths: {
            "domReady": "../js/lib/require/domReady",
            "model": "../js/model"
        }
    };

</script>

あなたの場合、次のようなパスを設定する必要があります

'player':    '../js/background/player.js',
'playlists': '../js/background/playlists.js'

ブログ投稿の場合と同様に、テストランナーにプレーヤーとスペックを明示的に要求します。

于 2012-09-30T21:01:12.997 に答える