我在使用Jasmine BDD框架执行ajax时遇到了麻烦。
我想测试实际的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 :(得分:2)
解答我自己的问题。 Jasmine中的Ajax调用需要异步。如果您不想更改代码以便能够测试它,可以使用ajaxSetup将async的dafault值设置为false
it("getsetting", function () {
$.ajaxSetup({
async:false
});
expect(getUserSetting(101,0)).toBe('30');
});
答案 1 :(得分:1)
虽然将async设置为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);
});
});
});
答案 2 :(得分:0)
据我所知,您希望使用jasmine编写集成测试,这很可能归功于jasmine的Async Support,我希望以下示例可以帮助您了解如何使用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限制,并且您的服务器必须根据响应部分返回标题“Access-Control-Allow-Origin:您的请求域”