2012-01-16 12 views
9

RequireJSを使用しているアプリケーションのテストをいくつか書いています。アプリケーションがどのように動作するかによって、requireを呼び出していくつかのクラスを取得する予定です。だから、テストのために、いくつかのダミーのクラスがありますが、私はこのテストのためだけに個々のファイルに入れる必要はありません。ここモジュールの定義とRequireJSですぐに使用する

define('test/foo', function() { 
    return "foo"; 
}); 

define('test/bar', function() { 
    return "bar"; 
}); 

test("...", function() { 
    MyApp.load("test/foo"); // <-- internally, it calls require('test/foo') 
}); 

問題は、スクリプトのonloadイベントが発射されるまで、これらのモジュールの評価が遅れているということです。私は多くがちょうどdefine()それら手動で私のテストファイル内のそのよう好むだろう。 require.js around line 1600から

//Always save off evaluating the def call until the script onload handler. 
//This allows multiple modules to be in a file without prematurely 
//tracing dependencies, and allows for anonymous module support, 
//where the module name is not known until the script onload event 
//occurs. If no context, use the global queue, and get it processed 
//in the onscript load callback. 
(context ? context.defQueue : globalDefQueue).push([name, deps, callback]); 

は私が手動でキューが評価されるようにトリガすることができ、いくつかの方法はありますか?

答えて

0

モジュール定義はファイルごとに1つに制限する必要があります(here参照)。私は、複数のモジュールを1つのファイルに定義すると、依存関係を解決する準備ができているかどうかを判断するためにスクリプトのloadイベントに依存する内部ローディング・メカニズムが壊れてしまうと思います。

テスト用であっても、これらの定義を複数のファイルに分割することをおすすめします。

希望に応えたい!乾杯。

+0

あなたはファイルごとに複数のモジュールを追加することができます(あなたがあなたのアプリケーション全体を縮小化+最適化する際に考慮す)、あなただけに持っています各モジュールに特定の名前を付けます(OP内の各 'define'関数への最初の文字列引数を参照してください)。 – nickf

+0

また、モジュールはテストのためのものであり、**非常に**基本的です。上記の例より少し複雑ですが、それほど多くはありません。それぞれを独自のファイルに入れることはあまりにも面倒です。 – nickf

+0

確かに分かります。しかし、ドキュメントからわかるように、複数のモジュールを持つ単一のファイルを持つ唯一のケースは、最適化/ビルドのステップが発生した後です。正直言って、私はrequirejsに精通しているわけではありませんが、私はいくつかのプロジェクトでそれを使ってきました。ドキュメントはかなり明確です: 'ディスク上のファイルごとに1つの*モジュール定義のみがあるべきです。モジュールは、最適化ツールによって最適化されたバンドルにグループ化することができます。私はそこから始めるでしょう:) – keeganwatkins

1

私がこれまでに見つけた最高の非同期モジュールを必要とすることです:

define("test/foo", function() { ... }); 
define("test/bar", function() { ... }); 

require(["test/foo"], function() { 
    var foo = require('test/foo'), 
     bar = require('test/bar'); 
    // continue with the tests.. 
});