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() 方法——事实上,如果你在回调结束时不小心再次调用 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())方法。这意味着一次只有一个 ajax 请求,但我可以忍受。祝你好运

于 2009-06-02T18:44:14.590 回答