Javascript 可以用jasmine模拟网络故障来模拟ajax请求吗?
我有一个web应用程序,需要检查用户是否连接到internet。在实现中,check()函数承诺,如果对已知端点的ajax ping成功,则为true;如果ajax调用以任何方式失败,则为false 在Jasmine中,我可以使用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 在茉莉花测试中我应该如何处理这个问题?这是一个有趣的问题。
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();
});
});
注:
是从done调用的errorFunction 如果errorFunction
以及所有其他readysate==4&&status==0
/错误
回调失败
返回makeAPICall
,对其使用jqXHR
和done
回调fail
是一个生成巨大负载的实用函数:用于test1getData
- 第二个测试是使用空的
进行一个伪ajax调用,以模拟url
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();
});
});