0

私はいくつかのテストをデバッグしようとしています - 私は次のコードを持っています:

test('Can get the test Side',
        function () {
            stop();
            debugger;
            var result = getTestSide();
            debugger;
            changeTestSide(result);
        }
    );


    // Step 1: Get test side
    function getTestSide() {
        $.ajax({
            type: 'GET',
            url: urlWithId,
            success: function (result) {
                return "test success";
                debugger;
                ok(true, "GET succeeded.");
                if (!result.SideId === testSideId) {
                    throw "GET result does not equal testSideId";
                } else {
                    ok(true, "Returned key matches testSide Id.");
                    return result;
                }
            },
            error: function (result) {
                return "test failure";
                debugger;
                throw "Error";
            }
        });
    };

何があっても、トップ メソッドの「結果」は常に未定義です。どうしてこれなの?getTestSide が成功するか失敗するかにかかわらず、文字列を返しています。

4

3 に答える 3

0

およびハンドラchangeTestSideからメソッドを呼び出す必要がありますsuccesserror

于 2013-03-17T18:49:00.480 に答える
0

ここでいくつか修正する必要があります。

success: function (result) {
    return "test success";
    debugger;
    ok(true, "GET succeeded.");
    if (!result.SideId === testSideId) {
        throw "GET result does not equal testSideId";
    } else {
        ok(true, "Returned key matches testSide Id.");
        return result;
    }
},

まず、AJAXchangeTestSide(result);の関数から呼び出す必要があります。successこれは、AJAX がデフォルトで非同期呼び出しであるためです。つまり、JavaScript は関数getTestSide()で続行する前に実行が完了するのを待機しませんtest。次に、success関数内で最初return "test success";に行うことは、関数を返すことであり、その下のコードは実際には実行されません。コードがどのようなものである必要があるかのより良い例を次に示します。

success: function (result) {
    debugger;
    ok(true, "GET succeeded.");
    if (!result.SideId === testSideId) {
        throw "GET result does not equal testSideId";
    } else {
        ok(true, "Returned key matches testSide Id.");
        changeTestSide(result);
    }
},
于 2013-03-17T18:51:20.713 に答える
0

returnネストされたリターン内で使用するfunctionと、その関数からのみ返されます。必要な効果を得るには、コードをまったく異なる構造にする必要があります。getTestSideこれを行う 1 つの方法は、次のように、応答を処理するコールバック関数を に渡すことです。

test('Can get the test Side',
    function () {
        stop();
        debugger;
        getTestSide(function (result) {
            changeTestSide(result);
        });
    }
);


// Step 1: Get test side
function getTestSide(cb) {
    $.ajax({
        type: 'GET',
        url: urlWithId,
        success: function (result) {
            // removed this because it stops the rest from running
            // return "test success";
            ok(true, "GET succeeded.");
            if (!result.SideId === testSideId) {
                throw "GET result does not equal testSideId";
            } else {
                ok(true, "Returned key matches testSide Id.");
                // Call the callback instead of returning.
                cb(result);
            }
        },
        error: function (result) {
            // removed this because it stops the rest from running
            // return "test failure";
            debugger;
            throw "Error";
        }
    });
};

throwまた、成功とエラーのコールバック内でも使用しました。これらの関数が実行されるまでに、テスト関数はすでに返されているため、これらの例外をキャッチする方法がないため、これらは期待どおりに機能しません。とにかくあなたのコードは例外をキャッチする試みを示さなかったので、これに対処しようとはしませんでしたが、関数と同様のパターンに従い、呼び出し元が実装できるとコールバックの$.ajax両方を提供することで対処できます。successerror

于 2013-03-17T18:52:44.950 に答える