3

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

  • 我做了一个 AJAX“PUT”跨域请求x-domain-abc.com/somestorage
  • 我包含用于身份验证的自定义标头
  • 这将触发预检 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 请求进行什么测试?

4

1 回答 1

1

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

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

Now, if you were in control of the server, it would be important to test the CORS preflight response. If you really want to be complete, you could set up tests to make preflight and regular CORS requests to your provider. However this would be outside the realm of a simple unit test, since it would be making a live request to a remote server.

于 2013-01-19T04:17:33.700 回答