0

QUnit のテストを始めたばかりで、最初のページで問題が発生しました:S

ASP.NET サービス参照を使用して、html ページでの非同期データ読み込みを利用し、同じプロジェクト内の Web サービスへの参照を作成します。ASP.NET が舞台裏 (ScriptManager コントロール) で行っていることは、サービス メソッドを表す JS ファイルを作成し、すべての AJAX 呼び出しを処理することです。

これを使用して、document.ready jQuery イベントでこれらのメソッドのいずれかを呼び出すページを作成します。現在、QUnit を使用してこの js ファイルに対してテストしようとしていますが、js ファイルで実際の Web サービスを呼び出すことは避け、代わりにモック サービスを使用します。これまでの試みのために私が持っているものは次のとおりです。

main.js (本番コード ファイル)

var Service;

$(document).ready(function () {

    //class definition created by asp.net behind the scenes
    Service = MyProject.services.DataService;

    //the method that calls the service
    LoadData();
});

function LoadData() {
    Service.GetData(OnGetDataSuccess, OnGetDataFailure);
}

main-test.js (テスト QUnit コード、main.js はこのページで参照されています)

function SetupMockService(result) {
    Service = { "GetData": function (OnSuccess, OnFailure) {
            GetDataCalled = true;
            OnSuccess(result);
            //this is required in an asyncTest callback, I think?
            start();
        }, "GetDataCalled": false};
}
$(document).ready(function () {
    module("LoadData");
    asyncTest("LoadData should call GetData from service", function () {
        SetupMockService(result);
        LoadData();
        equals(Service.GetDataCalled, true, "GetData has been called");
    });

このテストは失敗します。LoadData メソッドは、元の (main.js) document.ready イベントの一部として呼び出されるため、引き続き運用 Web サービスを呼び出しますが、その GetDataCalled 変数が設定されていない (または運用環境で定義されていない) ため、テストは失敗します。私は asyncTest を間違っていますか? (これは QUnit での私の最初の日なので、そうなる可能性が非常に高いです)

これが機能していることを確認できるもう 1 つの方法は、main.js の document.ready イベントをオーバーライドできる場合ですが、その方法についてはよくわかりません。また、本番環境の main.js コードに「testEnvironment == true」チェックを追加したくありません。

4

1 に答える 1

0

明らかな間違いが 1 つあるだけでなく、私は物事が少し逆行していたことがわかりました。動作する結果のコードは次のとおりです

main-tests.js

//the test itself isn't calling async methods, so it doesn't need to use asyncTest
test("LoadData should call GetData from service", function () {
    SetupMockService();
    LoadData();
    equals(Service.GetDataCalled, true, "GetData has been called");
});

function SetupMockService() {
    //redefining the Service variable specified in main.js with a mock object
    Service = { "GetData": function (OnSuccess, OnFailure) {
            //I forgot the "this" part... d'oh!
            this.GetDataCalled = true;
        }, "GetDataCalled": false
    };
}

これは、元の main.js の document.ready コードが実行されるという問題をまだ解決していませんが、それを理解します。

于 2010-10-06T20:22:43.737 に答える