2

JavaScriptコードのテストにjasmineを使用しています。
javascriptコードは、requireJsを使用してロードされるモジュールで構成されています。json requirejs-plugins
使用してjsonファイルをロードすると、Webブラウザーに出力が表示されません。 奇妙なことに、JavaScriptエラーが発生しません。text! plugin

これが私のコードです(1)。

何か案は?

PS:
わかりませんが、おそらく問題は時間の待ち時間に関するものです。
ローカル()からファイルを取得すると、機能しますtime latency = 6ms
リモートサーバー()からファイル(ローカルの同じコンテンツを含む)を取得するとtime latency = 170 ms、空のページが表示されます。
どうすればこの問題を解決できますか?


(1)

/*global define, window*/
(function () {
    'use strict';
    var specUrl = './';
    define([
        'jasmine',
        'jasmineHtml',
        'jasmineJquery',
        'json!json_data', // if I comment this line is ok, 
                          // otherwise I get empty page with no error
        specUrl + 'models/user.spec'
    ], function (jasmine) {
        var initialize = function () {
            // some code
        };

        return {
            initialize: initialize
        };
    });
}());

非同期仕様に関するドキュメントを読みましたが、どうすれば問題を修正できるかはまだわかりません。何か案は?
私は非常に単純なコードを投稿しました:(1)動作する、(2)動作しない、おそらくサーバーからjson_dataを取得するには約250ミリ秒かかるためです。

(1)

    define([
        'appJasmine',
//        'json!json_data',
    ], function (app) {
        app.initialize(); // it display data on browser
    });

(2)

    define([
        'appJasmine',
        'json!json_data',
    ], function (app) {
        app.initialize(); // it does not display data on browser
    });
4

2 に答える 2

1

非同期呼び出しについては、jasmineのドキュメントをご覧ください。おそらく、仕様を実行する前に、プロパティが存在するのを待つ必要があります。

https://github.com/pivotal/jasmine/wiki/Asynchronous-specs

更新された質問と提供されたjQueryプラグインのドキュメントを読むと、問題は明らかです。

/**
 * Your App code
 */
var myTestObj = {};
define([
    // some stuff
], function () {
    // will be called when everything is ready
    myTestObj.loaded = true;
});


/**
 * Jasmine spec
 */

describe("My suite", function() {

    it("should run some test", function() {
        // waitsFor is called periodically and will only execute
        // the following run statement when it returns true
        // waiting will be aborted after 10 seconds in this example
        waitsFor(function() {
            return myTestObj.loaded;
        }, "Async modules to be loaded", 10000);

        runs(function() {
            expect(myTestObj.loaded).toBeTruthy();
        });
    });

});

これは非常に基本的な例ですが、原則を理解する必要があります。WaitsForは定期的に条件をチェックし、待機が終了した後にrunステートメントを使用して実行できます。runステートメントを使用して、describe、it、またはexpect呼び出しをラップできます。

于 2012-07-17T22:29:49.980 に答える
1

すべてのモジュールの準備が整う前にexecJasmineを実行すると、空のページが表示されます。
したがって、execJasmine呼び出しに関するコードを投稿する必要があります。
たとえば、次のコードを実行している場合:

        window.onload = function () {
            if (currentWindowOnload) {
                currentWindowOnload();
            }
            execJasmine();
        };

空のページが表示されます。

これを実行すると、機能するはずです。

        setTimeout(function () {
            if (currentWindowOnload) {
                currentWindowOnload();
            }
            execJasmine();
        }, 0)
于 2012-07-18T08:02:49.457 に答える