Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该在sinon.js中模拟cors选项请求,还是应该如何测试跨域ajax请求?_Javascript_Jquery_Ajax_Cross Domain_Sinon - Fatal编程技术网

Javascript 我应该在sinon.js中模拟cors选项请求,还是应该如何测试跨域ajax请求?

Javascript 我应该在sinon.js中模拟cors选项请求,还是应该如何测试跨域ajax请求?,javascript,jquery,ajax,cross-domain,sinon,Javascript,Jquery,Ajax,Cross Domain,Sinon,我正在为正在开发的javascript/jquery库创建单元测试。我需要发出大量跨域Ajax请求,并尝试通过修改来尝试和模拟以下场景: 我向x-domain-abc.com/somestorage 我包括用于身份验证的自定义标题 这将触发飞行前选项请求 请求应该被fakeServer捕获,并用一些自定义头(我希望我的提供者添加的头;-)进行响应 之后,实际的“PUT”被完成,也被fakeServer捕获并相应地响应 我的请求如下所示: $.ajax({ url: url + '?_='

我正在为正在开发的javascript/jquery库创建单元测试。我需要发出大量跨域Ajax请求,并尝试通过修改来尝试和模拟以下场景:

  • 我向
    x-domain-abc.com/somestorage
  • 我包括用于身份验证的自定义标题
  • 这将触发飞行前选项请求
  • 请求应该被fakeServer捕获,并用一些自定义头(我希望我的提供者添加的头;-)进行响应
  • 之后,实际的“PUT”被完成,也被fakeServer捕获并相应地响应
我的请求如下所示:

$.ajax({
  url: url + '?_=' + Date.now(),
  type: 'PUT',
  data: document,
  async: true,
  crossdomain: true,
  headers : {
  Authorization: 'Basic ' + Base64.encode(
    priv.user + ':' + priv.pass
    )
  },
  success: function () {
      // do sth
  },
  error: function () {
      // do sth else
  }
});
在我的测试模块中,我目前正在执行以下操作:

test ("Put", function(){
  var o = generateTools(this);
  // lib invocation
  o.jio = JIO.newJio({
    "type": "dav",
    "username": "davput",
    "password": "checkpwd",
    "url": "https://ca-davstorage:8080"
  });

  // put non empty document
  o.addFakeServerResponse("PUT", "put1", 201, "HTML RESPONSE");
  o.spy (o, "value", {"ok": true, "id": "put1"},
         "Create = PUT non empty document");
  // the JSON "document" that should be stored
  o.jio.put({"_id": "put1", "title": "myPut1"}, o.f);
  o.clock.tick(5000);
  o.server.respond();
  o.jio.stop();
});
O
包括:

generateTools = function (sinon) {
  var o = {};
  o.t = sinon;
  o.server = o.t.sandbox.useFakeServer();
  o.clock = o.t.sandbox.useFakeTimers();
  o.clock.tick(base_tick);
  o.spy = basicSpyFunction;
  o.tick = basicTickFunction;
  ...
  o.addFakeServerResponse = function (method, path, status, response) {
    var url = new RegExp('https:\\/\\/ca-davstorage:8080\\/' + path +
                    '(\\?.*|$)');
    o.server.respondWith(method, url,
      [status, { "Content-Type": 'application/xml' }, response]
    );
  }
  return o;
},
问题:
测试选项/飞行前是否有意义,因为它是由浏览器内部处理的,我无法访问或影响它


如果没有,我应该对CORS请求进行什么测试

因为单元测试正在运行JavaScript代码,所以不需要测试CORS飞行前响应。正如您所提到的,飞行前的细节由浏览器在幕后处理。因此,没有代码来测试如何处理预飞行

您真的不需要做任何特定于CORS的测试,因为浏览器会为您处理所有这些细节。从JavaScript的角度来看,CORS请求看起来就像普通的XmlHttpRequest。您的伪服务器应该只返回一个预期的响应,并且您的单元测试应该检查您的代码是否正确处理该响应


现在,如果您控制着服务器,那么测试CORS飞行前响应将非常重要。如果您真的想完成,您可以设置测试,向提供商发出飞行前和常规CORS请求。但是,这将超出简单单元测试的范围,因为它将向远程服务器发出实时请求。

ok。和我最后做的差不多。我在fakeServer上运行了所有内容,然后(在qunit之外)设置了一个活动虚拟服务器,以查看所有内容是否也在活动环境中工作。谢谢你的回答