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 と同じように見えます。偽のサーバーは期待どおりの応答を返す必要があり、単体テストでは、コードがこの応答を正しく処理することを確認する必要があります。

サーバーを制御している場合は、CORS プリフライト応答をテストすることが重要です。本当に完全にしたい場合は、テストを設定して、プロバイダーにプリフライトおよび通常の CORS リクエストを行うことができます。ただし、これはリモート サーバーにライブ リクエストを行うため、単純な単体テストの範囲外です。

于 2013-01-19T04:17:33.700 に答える