Javascript 可以用jasmine模拟网络故障来模拟ajax请求吗?

Javascript 可以用jasmine模拟网络故障来模拟ajax请求吗?,javascript,jasmine,jasmine-ajax,Javascript,Jasmine,Jasmine Ajax,我有一个web应用程序,需要检查用户是否连接到internet。在实现中,check()函数承诺,如果对已知端点的ajax ping成功,则为true;如果ajax调用以任何方式失败,则为false 在Jasmine中,我可以使用request.respondWith({status:400,etc})来模拟失败,但我不知道如何模拟根本没有进行调用的更基本的错误 实际上,浏览器似乎在无法调用时“返回”状态代码0和readyState 4 在茉莉花测试中我应该如何处理这个问题?这是一个有趣的问题。

我有一个web应用程序,需要检查用户是否连接到internet。在实现中,check()函数承诺,如果对已知端点的ajax ping成功,则为true;如果ajax调用以任何方式失败,则为false

在Jasmine中,我可以使用
request.respondWith({status:400,etc})
来模拟失败,但我不知道如何模拟根本没有进行调用的更基本的错误

实际上,浏览器似乎在无法调用时“返回”状态代码0和readyState 4


在茉莉花测试中我应该如何处理这个问题?

这是一个有趣的问题。虽然我可能不会给你一个直截了当的答案,但我还是想尝试一下

下面的代码演示了三个这样的示例(测试)。从中看到它

var errorFunction=function(jqXHR,status,error){
console.log('这是errorFunction')
}
var makeAPICall=函数(url){
返回$.ajax({
url:url,
失败:错误函数,
错误:errorFunction
});
}
var testFunction=function(){
makeAPICall().done(函数(数据、状态、xh){
if(xh.status==0&&xh.readyState==4){
errorFunction();
返回;
}
log(“这是successFunction”);
}).失败(错误功能);
}
var getData=function(){
var str='ABCDEFGHIJ'
var returnStr='';
对于(变量i=0;i<3000;i++){
returnStr+=str;
}
返回返回str;
}
描述('test ajax errors',function()){
它('由于巨大的负载而测试失败的调用',函数(){
var xhrObj=$.ajax({
网址:'https://jsonplaceholder.typicode.com/posts?userId=“+getData(),
异步:false
});
log('下面是通过spy返回的xhr对象');
console.log(xhrObj);
spyOn(窗口,'makeAPICall')。和.returnValue(xhrObj);
spyOn(窗口'errorFunction')。和.callThrough();
testFunction();
expect(window.errorFunction).toHaveBeenCalled();
});
它('测试由于某些n/w错误场景(readyState->4,status->0)而导致的失败调用),函数(){
var xhrObj=$.ajax({
url:“”,
异步:false
});
xhrObj.status=0;
xhrObj.statusText='error';
log('下面是通过spy返回的xhr对象');
console.log(xhrObj);
spyOn(窗口,'makeAPICall')。和.returnValue(xhrObj);
spyOn(窗口'errorFunction')。和.callThrough();
testFunction();
expect(window.errorFunction).toHaveBeenCalled();
});
它('测试失败的调用(错误的url模式)',函数(){
var xhrObj=$.ajax({
网址:'https://jsonplaceholder.typicode.com/postssss/1',
异步:false
});
log('下面是通过spy返回的xhr对象');
console.log(xhrObj);
spyOn(窗口,'makeAPICall')。和.returnValue(xhrObj);
spyOn(窗口'errorFunction')。和.callThrough();
testFunction();
expect(window.errorFunction).toHaveBeenCalled();
});
});
注:

  • errorFunction
    是从done调用的errorFunction 如果
    readysate==4&&status==0
    以及所有其他
    错误
    /
    失败
    回调
  • makeAPICall
    返回
    jqXHR
    ,对其使用
    done
    fail
    回调
  • getData
    是一个生成巨大负载的实用函数:用于test1
  • 第二个测试是使用空的
    url
    进行一个伪ajax调用,以模拟
    readyState->4&status->0
  • 第三个测试模拟了常见的坏请求url模式测试
  • 对于所有3种场景,我都使用了由
    $.ajax({some params&async false})
  • 设置
    async:false
    有助于生成一个虚拟对象,并通过
    spy

您可以使用
window.navigator.onLine
来检查您是否仍然具有网络连接。您不能只ping一个不存在的URL吗?这将始终以失败状态进行响应
  var errorFunction = function(jqXHR, status, error) {  
    console.log('This is errorFunction')  
  }

  var makeAPICall = function(url) {
    return $.ajax({
      url: url,
      fail: errorFunction,
      error: errorFunction
    });
  }

  var testFunction = function() {
    makeAPICall().done(function(data, status, xh) {
      if (xh.status === 0 && xh.readyState == 4) {
        errorFunction();
        return;
      }
      console.log("this is successFunction");
    }).fail(errorFunction);
  }

  var getData = function() {
    var str = 'ABCDEFGHIJ'
    var returnStr = '';
    for (var i = 0; i < 3000; i++) {
      returnStr += str;
    }
    return returnStr;
  }

  describe('test ajax errors', function() {
    it('tests a failed call due to huge payload ', function() {
      var xhrObj = $.ajax({
        url: 'https://jsonplaceholder.typicode.com/posts?userId=' + getData(),
        async: false
      });
      console.log('Below is the xhr object that is breing returned via spy');
      console.log(xhrObj);    
      spyOn(window, 'makeAPICall').and.returnValue(xhrObj);
      spyOn(window, 'errorFunction').and.callThrough();    
      testFunction();
      expect(window.errorFunction).toHaveBeenCalled();
    });

    it('tests a failed call due to some n/w error scenario (readyState->4, status->0)', function() {
      var xhrObj = $.ajax({
        url: '',      
        async: false
      });
      xhrObj.status = 0;
      xhrObj.statusText = 'error';
      console.log('Below is the xhr object that is breing returned via spy');
      console.log(xhrObj);    
      spyOn(window, 'makeAPICall').and.returnValue(xhrObj);
      spyOn(window, 'errorFunction').and.callThrough();    
      testFunction();
      expect(window.errorFunction).toHaveBeenCalled();
    });

    it('tests a failed call (bad url pattern)', function() {
      var xhrObj = $.ajax({
        url: 'https://jsonplaceholder.typicode.com/postssss/1',
        async: false
      });
      console.log('Below is the xhr object that is breing returned via spy');
      console.log(xhrObj);    
      spyOn(window, 'makeAPICall').and.returnValue(xhrObj);
      spyOn(window, 'errorFunction').and.callThrough();    
      testFunction();
      expect(window.errorFunction).toHaveBeenCalled();
    });


  });