14

JavaScriptユニットテスト用のQUnitを調べています。Ajax呼び出しから返された値と照合しているという奇妙な状況にあります。

次のテストでは、意図的に失敗させようとしています。

// test to check if the persons are returned! 
test("getPersons", function() {
  getPersons(function(response) {
    // persons = $.evalJSON(response.d);
    equals("boo", "Foo", "The name is valid");
  });
});

しかし、それは常に通過することになります。これがAjax呼び出しを行うgetPersonsメソッドです。

function getPersons(callback) {
  var persons = null;

  $.ajax({
    type: "POST",
    dataType: "json",
    data: {},
    contentType: "application/json",
    url: "AjaxService.asmx/GetPersons",
    success: function(response) {
      callback(response);
    }
  });
}
4

4 に答える 4

25

QUnit ライブラリを使用した開始と停止は機能しているようです。

// test to check if the persons are returned!
test("getPersons", function() {
  stop();
  getPersons(function(response) {
    persons = $.evalJSON(response.d);
    equals(persons[0].FirstName, "Mohammad");
    start();
  });
});
于 2009-06-02T18:46:34.273 に答える
13

ここでの本当の問題は、start() および stop() メソッドを呼び出す必要がないことです。追加の .ajax() メソッド。これは、すべてのコールバックが起動されたかどうかを追跡して、 stop() を再度呼び出す必要があるかどうかを確認する必要があるという、厄介な混乱に陥ることを意味します。

問題の根本には、非同期リクエストのデフォルトの動作が関係しています。簡単な解決策は、 asyncプロパティを false に設定して、.ajax() リクエストを同期的に発生させることです。

test("synchronous test", function() {
  $.ajax({
    url:'Sample.asmx/Service',
    async:false,
    success: function(d,s,x) { ok(true, "Called synchronously"); }
  });
});

それでも、最善のアプローチは、非同期動作を許可し、適切なテスト メソッド呼び出しasyncTest()を使用することです。ドキュメントによると、「非同期テストはキューに入れられ、次々に実行されます。通常の test() を呼び出してすぐに stop() を呼び出すのと同じです。

asyncTest("a test", function() {
  $.ajax({
    url: 'Sample.asmx/Service',
    success: function(d,s,x) {
      ok(true, "asynchronous PASS!");
      start();
    }
  });
});
于 2010-10-05T23:22:29.417 に答える
3

私のプロジェクトには多くのqunitテストがあります。お気に入り:

    module("comment");
    asyncTest("comment1", function() {
      expect(6);
      $.ajax({
        url: 'http://xxx.com/comment',
        dataType: "json",
        type: "GET",
        timeout: 1000
      }).done(function(data) {
        ok(true, "loaded");
        ok(data.data.length>1, "array size");
        ok(data.total, "attr total");
        var c = data.data[0];
        ok(c.id, "attr c.id");
        ok(c.user_id, "attr c.user_id");
        ok(c.type == 4, "attr c.type equal 4");
      }).fail(function(x, text, thrown) {
        ok(false, "ajax failed: " + text);
      }).always(function(){
        start();
      });
    });
于 2013-04-15T12:49:39.757 に答える
2

ajaxでいくつかのqunitテストを行いました。それはきれいではありません。私ができる最善のことは、ajaxが起動されたときにテストを停止し、成功のコールバックで再度開始することです。(start() および stop() メソッドを使用)。これは、一度に 1 つの ajax リクエストを意味していましたが、私はそれを受け入れることができました。幸運を

于 2009-06-02T18:44:14.590 に答える