4

phantomjsを使用してジャスミンテストを実行しています。私のジャスミンテストでは、すべての適切なモジュールがロードされていることを確認するために、describeブロックの周りにrequireを使用しています。

page.evaluate -> jasmine.getEnv().execute();requirejsがモジュールのロードを完了する前に実行するため、テストは実行されませんでした。

誰かがこれを回避する本当に良い方法を知っているかどうか疑問に思いました。以下に投稿する回答がありますが、他の回答を介してメモを比較したいと思います。あなたの方が良ければ、私は明らかに答えとしてそれを選びます:)

4

2 に答える 2

3

私は少し違うことをしました-私のHTMLページにはrequire()呼び出しでラップされた関数があります:

var run_tests = function (specfiles) {
    require(specfiles, function () {
        jasmine.getEnv().execute();
    });
};

その後私はpage.evaluate( function (test_specs) { run_tests(test_specs) }, ['test1.spec', 'test2.spec']);

于 2012-09-09T16:37:35.647 に答える
2

jQueryが利用可能な私のソリューションは次のとおりです。

テストを実行する前に、構成ファイルをロードします。

var jasmine_deferreds = [];

// Setup an event to fire on the document
// I actually did this with native code rather than jquery because
// I wanted to minimize jquery usage

// ....

// setTimeout so all files loaded after this will finish registering their requires
setTimeout( function() {

  $.when.apply( null, jasmine_deferreds ).then( function() {

    // Fire event that was created

  });

}, 5 );

延期された配列をどのように構築し、それらを解決するかはあなた次第です。私は基本的に配列にプッシュし、要求が行われたときに解決しました。requireを、完了時に自動的に解決することを認識している独自のバージョンでラップしたので、各テストで手動でプッシュして解決する必要はありません。

次に、ファントムファイルでこれを行います。

page.evaluate ->
    mylistener = ( document ) -> jasmine.getEnv().execute();
    document.addEventListener( 'test_ready_event', mylistener, false);

これにより、必要なモジュールがすべてロードされていることがわかりsetTimeoutます。ロードするファイルが多すぎると、短すぎる可能性があります。setTimeout私が使用しているものは、メインのコールスタックが完了した後にのみ起動するために使用されているため、安全です。本当に時間は気にしません。

于 2012-08-29T23:10:26.173 に答える