【问题标题】:Should I simulate a cors OPTIONS request in sinon.js or how do I test cross domain ajax requests?我应该在 sinon.js 中模拟 cors OPTIONS 请求还是如何测试跨域 ajax 请求?
【发布时间】:2012-12-31 19:51:52
【问题描述】:

我正在为我正在处理的 javascript/jquery 库创建单元测试。我需要发出很多跨域 Ajax 请求,并试图通过Sinon.js 来尝试模拟以下场景:

  • 我向x-domain-abc.com/somestorage 发出 AJAX“PUT”跨域请求
  • 我正在包括用于身份验证的自定义标头
  • 这将触发预检 OPTIONS 请求
  • 请求应该被 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;
},

问题:
测试 OPTIONS/preflight 是否有意义,因为它是浏览器内部处理的东西,我无法访问或影响?

如果不是,我应该对 CORS 请求进行哪些测试?

【问题讨论】:

    标签: javascript jquery ajax cross-domain sinon


    【解决方案1】:

    由于您的单元测试正在执行您的 JavaScript 代码,因此您不需要测试 CORS 预检响应。正如您所提到的,预检的详细信息由浏览器在幕后处理。所以没有代码来测试处理预检。

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

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

    【讨论】:

    • 好的。我最终做了什么。我在 fakeServer 上运行了所有东西,然后(在 qunit 之外)设置了一个实时虚拟服务器,以查看所有东西是否也在实时环境中工作。感谢您的回答
    猜你喜欢
    • 2015-03-01
    • 2014-12-27
    • 2016-09-12
    • 2012-12-20
    • 2011-12-26
    • 2012-04-17
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多