Jasmine 2.0如何处理ajax请求

时间:2014-03-07 09:19:09

标签: ajax jasmine

我想测试一个包含ajax请求的函数。测试应该等待ajax-request成功/失败。运行测试不起作用,因为它现在不会等待。

我希望接受测试:

this.requestServerBoxId = function()
{
    //ajax-request
    $.ajax({
        url: this.host_addr+"/?getid="+this.name,
        type: 'POST',
        data: {_data:this._data},
        success: function(data) {
            return IdSuccess(data);
        },
        error: function(data){
            return false;
        }
    });
}
function IdSuccess(data){
   if(typeof data != undefined)
       return true;
    return false;
}

这是我的测试:

it("should call a function after ajax-success", function(){
    expect(this.Process.requestServerBoxId()).toBe(true);
});

我试过间谍,但我猜我错了:

 spyOn($, 'ajax' ).and.returnValue(123);

我希望每次发出ajax请求时,这个间谍都会返回123。但它不起作用。

2 个答案:

答案 0 :(得分:12)

使用Jasmine 2.0,有一个全新的API用于测试ajax(以及其他所有内容)。

而不是:

spyOn($, 'ajax').and.returnValue(123);

beforeEach测试之前设置afterEachit方法:

beforeEach(function() {
  jasmine.Ajax.install();
  jasmine.Ajax.stubRequest('YOUR_URL_HERE').andReturn({
    responseText: 'YOUR_RAW_STUBBED_DATA_HERE'
  });
});

afterEach(function() {
  jasmine.Ajax.uninstall();
});

it('My Ajax Test', function() {
  // . . . code that makes an ajax request . . .
});

it测试将按预期执行其ajax请求。

请注意,这会使您的ajax调用基本上同步但是立即执行。

答案 1 :(得分:1)

您可能希望查看https://github.com/pivotal/jasmine-ajax之类的内容。这将允许您存根ajax请求并指定您希望它返回的内容,其行为更像是普通的ajax请求。

此实例中spyOn的问题在于jQuery $.ajax方法实际上返回的内容更像是一个承诺,然后您必须将正确的结果发送到,所以一个简单的.and.returnValue不会做正确的事。