1

私はUT/IT用のJasmineでsinonjsの偽のサーバーを使用しています。server.autorespond=trueを設定しました。(server.autoRespondAfterのミリ秒を減らした後でもチェックされます)

問題:サーバーが要求に応答した後、コールバックがトリガーされません(サーバー要求のログとサーバー・オブジェクト自体をチェックして、応答テキストを確認できます)。Jasmineは、成功または失敗のcallback.CalledOnceのチェックに失敗します。

この問題は、次の場合には発生しません。server.respondWith(..)を設定した後にserver.respond()を使用していて、サーバーの応答後にコールバックが適切にトリガーされた。Jasmineは、成功または失敗のコールバックのチェックに合格します。CalledOnce。

私の理解では、自動応答により、サーバーは非同期要求を受け取ったときに自動的に応答します。これには、適切なコールバックの呼び出しが含まれますか?それでもserver.respondを使用する必要がありますか?

ありがとう。

コードスニペット:必要なjsonファイルを読み取り、サーバー応答として送信します。読み取られたjsonファイルは同期呼び出しです(非同期false)。

this.server = sinon.fakeServer.create();
this.server.autoRespond = true;
sinon.FakeXMLHttpRequest.useFilters = true;

sinon.FakeXMLHttpRequest.addFilter(function (method, url, async, username, password) {
  // Don't fake json file read requests
  if (url == inputUrl) {
    return true;
  }
});

this.resultfile = this.readJsonFile(inputUrl);

this.server.respondWith("GET", endUrl,
  [200, { "Content-Type": "application/json" }, this.resultfile]);

console.log (this.server.requests); // Logs all requests so far

私のジャスミンスペックでは

var callbacks = [sinon.spy(),sinon.spy()];

// call the above sinon code and then make the test call below

jQuery.ajax({
     url: '/abc',
     success: callbacks[0]
});

// this fails, though I can see the server responded to the request.
expect(callbacks[0].calledOnce).toBeTruthy();
4

2 に答える 2

2

これが古いスレッドであることは知っていますが、Google社員向けに更新すると思いました:

Sinon docsautoRespondは、非同期で実行されるため、テストには適していないと述べています。これはデフォルトで 10 ミリ秒後に設定されます。これは、実行の次のフレームにバンプするのに十分な時間であり、テストで競合状態が発生する可能性があります。これを発見したのは、AJAX に関連する同様の失敗したテスト ケースがあったからです。

respondImmediately最終的に、すべてのリクエストに同期的に応答するプロパティを fakeServer に実装しました。これは数週間前 (v1.14.0) にプロジェクトにマージされたばかりですが、最新バージョンに更新すれば入手できるはずです。こちらのドキュメントをご覧ください。

this.server.autoRespondプロパティを true に設定する代わりに、プロパティを true に設定this.server.respondImmediatelyします。この時点で、電話をかける必要はありませんthis.server.respond()

于 2015-04-01T01:06:44.830 に答える
0

jQuery.ajax は非同期です。expect() を呼び出す前に十分な時間待機しないと、テスト ケースは失敗します。または、特定のタイプのリクエスト (クロスドメインなど) では機能しませんが、make .ajax synchronous を設定することもできますjQuery.ajax({ url: '/abc', async: false, success: callbacks[0] });...詳細については、jquery API ドキュメントを参照してください。

于 2012-07-03T04:44:15.197 に答える