Ajax没有用Jasmine执行

时间:2011-09-23 15:19:45

标签: javascript jquery ajax jasmine

我在使用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,它永远不会进入成功函数。

我做错了什么?

3 个答案:

答案 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:您的请求域”