2011-09-23 59 views
4

我有用Jasmine BDD框架執行ajax的麻煩。Ajax沒有用Jasmine執行

我想測試實際的ajax調用,而不是做出假的響應。我已閱讀文檔並嘗試了所有內容,但似乎忽略了ajax代碼。我也嘗試過使用間諜,但它似乎沒有幫助。

不工作一個非常簡單的例子:

describe("A jQuery ajax test", function() { 
    it("should make AJAX request", function() { 
    expect(testAjax()).toBe(1); 
    }); 
}); 

function testAjax() { 
    var ret=0 
    $.ajax({ 
    type: "GET", 
    url: "obj.json", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data){ret=1;} 
    }); 
    return ret; 
} 

返回始終爲0,它從來沒有進入成功的功能。

我在做什麼錯?

+0

有人有一個可以成功執行Ajax與Ajax共享的示例項目嗎? – a2011

回答

2

解答我自己的問題。 Jasmine中的Ajax調用需要是異步的。如果你不想改變你的代碼,能夠測試它,你可以使用ajaxSetup設置dafault值異步爲假

it("getsetting", function() { 
    $.ajaxSetup({ 
    async:false 
    }); 
    expect(getUserSetting(101,0)).toBe('30'); 
}); 
1

在設置異步爲false解決這個問題它通常不是一種選擇在大多數Web應用程序中,因爲整個頁面在ajax調用期間將被鎖定。

我會將回調函數傳遞給testAjax()方法,當您從Web服務獲得響應時將執行該方法。然後你可以在你的回調中做出斷言(期望)。

它應該是這個樣子:

function testAjax(callback) { 
    var ret=0 
    $.ajax({ 
    type: "GET", 
    url: "obj.json", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data){ 
     callback(ret); 
    }, 
    error:function(){ 
     callback(ret); 
    } 
    }); 
} 

describe("A jQuery ajax test", function() { 
    it("should make AJAX request", function() { 
    testAjax(function(ret){ 
     expect(ret).toBe(1); 
    });  
    }); 
}); 
+1

問題是,如果我沒有異步:false,Ajax調用永遠不會完成... – a2011

0

我明白,你想編寫使用茉莉一個集成測試,這是異步的支持很可能要感謝的是茉莉花有,我希望下面的例子將有助於您瞭解如何使用Jasmine的Async功能編寫實際的集成測試:

describe("A jQuery ajax test", function() { 

it("should make AJAX request", function() { 
var return = null; 


runs(function(){ 
// hosts actual ajax call 
     return = testAjax(); 
}); 

waitsFor(function(){ 
//this method polls until the condition is true or timeout occurs,whichever occurs first 
return return.readyState==4; 
},"failure message",700//timeout in ms 
); 

runs(function(){ 
// 2nd runs block can be used to verify the actual change in state 
// Add other relevant expectation according to your application context. 
     expect(return).toBeTruthy(); 

}); 

}); 

});

function testAjax() { 
// result here is a deffered object whose state can be verified in the test 
var result = null; 
result = $.ajax({ 
    type: "GET", 
    url: "obj.json", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function() { //do something on success} 
    }); 
return ret; 
}​ 

請注意:運行AJAX調用你會被Cross-origin_resource_sharing加以限制,您的服務器必須返回按照響應頭「訪問控制允許來源:您的請求域」的一部分