2016-08-11 25 views
0

だから私はAjax呼び出しを行う 'getTheValues'というメソッドをテストしたいと思っています。私は値を使ってサーバーレスポンスを嘲笑しましたが、テストを実行すると2つの失敗が発生しますが、なぜ失敗したのか説明はありません。私はここで間違って何をしていますか?最初QUnitテスト:メソッド内のAjax呼び出しの応答をテストする方法は?

test("Test - call Ajax within method.", function() { 
var callback = sandbox.spy(); 
server.respondWith("GET", "/ajaxtest/getmethod", 
        [200, { "Content-Type": "application/json" }, 
        '[{ "id": 123, "name": "John" }]']); 

getTheValues(); 
server.respond(); 

ok(callback.calledOnce, "Callback was called once"); 
ok(callback.calledWith([{ id: 123, name: "John" }]), "Callback with correct values."); 
}); 

function getTheValues(callback) { 
// do some stuff including an ajax call: 

$.ajax({ 
    type: 'GET', 
    dataType: 'json', 
    cache: false, 
    url: '/ajaxtest/getmethod', 
    success: function(data) { 
    } }); 
} 
+0

私たちが助けることができるようになる前に、失敗の内容を知っておく必要があります... qunitはあなたに何を返すのですか?コードを見るだけで、 'success'ハンドラが' sandbox'と呼ばれるものを呼び出していると思います。正直に分かりません。 – jakerella

答えて

0

(作業)コード:

QUnit.module('Test Module', { 
    before: function() { 
    this.server = sinon.fakeServer.create(); 
    }, 
    after: function() { 
    this.server.restore(); 
    delete this.server; 
    } 
}); 

QUnit.test("Test - call Ajax within method.", function (assert) { 
    var callback = sinon.spy(jQuery, "ajax"); 
    this.server.respondWith("GET", "/ajaxtest/getmethod", /*?id=123&name=-John*/ 
    [200, { "Content-Type": "application/json" }, 
     '[{ "id": 123, "name": "John" }]']); 

    var a = getTheValues(); 
    this.server.respond(); 

    assert.ok(callback.calledOnce, "Callback was called once"); 
    var callArgs = callback.args[0][0]; 
    assert.equal(JSON.stringify(callArgs.data), JSON.stringify({ "id": 123, "name": "John" })); 
}); 


function getTheValues() { 
    // do some stuff including an ajax call: 

    $.ajax({ 
    data: { id: 123, name: "John" }, 
    method: 'GET', 
    dataType: 'json', 
    cache: false, 
    url: '/ajaxtest/getmethod', 
    success: function (data) { 
    } 
    }); 

次の説明

  1. これは、これは純粋なQUnitのテストではありません私には思えます。あなたはSinonJSも使っていると思います。あなたはそれが偽/ trueを返すために、あなたはこのようにcallback.calledWithを使用することはできません

    sinon.spy(jQueryの、 "AJAX")

  2. 見張らされるかを指定する必要がありスパイ法上の

  3. オブジェクト({} === {})を比較すると(ほとんど)常にfalseが返されます。したがって、このテストは常に失敗します。代わりにスパイの引数(あなたの場合はcallback.args [0] [0];)を必要とし、特定の部分と目的の結果を比較します。これに関する詳細はfind here 実際にはそれらを抽出する必要はありませんが、私はコードを(うまくいけば)より明確にするために行いました。

だから

  • 第1抽出引数、
  • 次strignifyオブジェクトが 期待値
と比較するために同じ方法を使用し、その後、他のコードなし 同等と
  • すべき

    最後に、あなたのモックオブジェクトは、w GETリクエストと一緒に送ってください。

    HTH

  • 関連する問題