Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript QUnit使用Ajax,QUnit通过了失败的测试_Javascript_Jquery_Ajax_Unit Testing_Qunit - Fatal编程技术网

Javascript QUnit使用Ajax,QUnit通过了失败的测试

Javascript QUnit使用Ajax,QUnit通过了失败的测试,javascript,jquery,ajax,unit-testing,qunit,Javascript,Jquery,Ajax,Unit Testing,Qunit,我正在研究用于JavaScript单元测试的QUnit。我遇到了一个奇怪的情况,我正在检查Ajax调用返回的值 function getPersons(callback) { var persons = null; $.ajax({ type: "POST", dataType: "json", data: {}, contentType: "application/json", url: "AjaxService.asmx/GetPersons

我正在研究用于JavaScript单元测试的QUnit。我遇到了一个奇怪的情况,我正在检查Ajax调用返回的值

function getPersons(callback) {
  var persons = null;

  $.ajax({
    type: "POST",
    dataType: "json",
    data: {},
    contentType: "application/json",
    url: "AjaxService.asmx/GetPersons",
    success: function(response) {
      callback(response);
    }
  });
}
在接下来的测试中,我故意尝试不及格

// 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);
    }
  });
}

我用ajax做了一些质量测试。它不漂亮。我能做的最好的事情就是在启动ajax时停止测试,并在成功回调中再次启动它。(使用start()和stop()方法)。这意味着每次只能有一个ajax请求,但我可以接受。祝你好运

开始和停止使用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();
  });
});

这里真正的问题是不需要调用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"); }
  });
});
即使如此,最好的方法还是允许异步行为并使用正确的测试方法调用:。根据文档“异步测试排队并一个接一个地运行。相当于调用普通测试()并立即调用stop()


在我的项目中有很多质量测试。比如:

    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();
      });
    });

启动和停止似乎都起作用了!解决方案发布在下面的帖子中。谢谢但我想知道为什么我的上述方法不起作用。我可以访问响应和所有内容。似乎平等者都失败了!我认为,由于ajax的异步特性,测试在响应返回之前就完成了AsyncTest(名称,…)是一种方便的测试方法(名称,函数(){stop();…})。嵌套=坏主意。@Jörn-谢谢你指出嵌套。回过头来看这个答案,我不确定我为什么要把它放在第一位,而不是为了说明你能做什么。我已经打开了asyncTest方法的包装,以便更清楚地了解它的用途。我建议您也填写“expect”数字(QUnit.test的第二个参数)),以便在没有及时调用所有内容时更容易捕获。否则,如果在发送所有断言之前过早调用了
start
,则它可能会通过。正如@Goyuix所说,您也可以使用
asyncTest()
而不是
test()
来避免调用
stop()
函数,并明确表示这是一个异步测试。