我想测试一个包含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。但它不起作用。
答案 0 :(得分:12)
使用Jasmine 2.0,有一个全新的API用于测试ajax(以及其他所有内容)。
而不是:
spyOn($, 'ajax').and.returnValue(123);
在beforeEach
测试之前设置afterEach
和it
方法:
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
不会做正确的事。