Должен ли я имитировать запрос опций cors в sinon.js или как тестировать междоменные ajax-запросы?


Я создаю модульные тесты для библиотеки javascript/jquery, над которой работаю. Мне нужно сделать много междоменных запросов Ajax и я пытаюсь пробиться через Sinon.js , чтобы попытаться смоделировать следующий сценарий:

  • я делаю AJAX" PUT " кросс-доменный запрос к 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?

1 2

1 ответ:

Поскольку модульные тесты реализуют ваш JavaScript-код,вам не нужно тестировать ответ CORS preflight. Как вы уже упомянули, детали предполетной подготовки обрабатываются за кулисами браузером. Таким образом, нет никакого кода для тестирования на обработку предполетного задания.

Вам действительно не нужно делать никаких тестов CORS, так как браузер обрабатывает все эти детали для вас. С точки зрения вашего JavaScript, запрос CORS выглядит так же, как обычный XmlHttpRequest. Твоя подделка сервер должен просто возвращать ожидаемый ответ, а модульные тесты должны проверять, правильно ли код обрабатывает этот ответ.

Теперь, если вы управляете сервером, было бы важно проверить реакцию CORS перед полетом. Если вы действительно хотите быть завершенным, вы можете настроить тесты для выполнения предварительных и регулярных запросов CORS к вашему поставщику. Однако это было бы за пределами области простого модульного теста, так как он будет делать живой запрос к удаленному серверу.