1

我正在尝试构建一个 Qunit 测试来测试一个 ajax 后调用。我正在使用 mockajax 来模拟​​呼叫。但是,我无法让测试与异步调用一起工作。

这是我的源代码:

源代码:

ajaxFunc  = function(element){
  $.post({
  type:'POST',
  url: '/temp/',
  dataType:'json',
  success: function(data){
    element.text("changed in func");
  },
  error: function(data){
    //do something
  },
  timeout: 60000
      });
}

syncFun = function(element){
  element.text("changed in func");
}

这是我的测试代码:

测试2.js

function mockSuccess(){
  $.mockjax({
    url: "/temp/",
    responseText:  { success: true }
  });
}

QUnit.test( "test ajax async", function( assert ) {
  mockSuccess();
  var done = assert.async();
  var element = document.createElement("div");
  ajaxFunc($(element));
  $(element).text("old");
  setTimeout(function() {
    assert.strictEqual($(element).text(), 'changed in func');
    done();
  });
});

QUnit.test( "test sync", function( assert ) {
  var element = document.createElement("div");
  $(element).text("old");
  syncFun($(element));
  assert.strictEqual($(element).text(), 'changed in func');
});

第一次测试失败,第二次成功。如果我在成功回调中的 source.js 中添加注释,我实际上会看到帖子成功并更改了元素文本。

换句话说,除了测试帖子的结果之外,一切正常。

我查看了https://qunitjs.com/cookbook/和堆栈溢出的示例,但没有运气。

4

1 回答 1

2

看起来我只需要添加几毫秒即可使异步调用生效:

QUnit.test( "test ajax async", function( assert ) {
  mockSuccess();
  var done = assert.async();
  var element = document.createElement("div");
  ajaxFunc($(element));
  $(element).text("old");
  setTimeout(function() {
   assert.strictEqual($(element).text(), 'changed in func');
   done();
  }, 800);
  // ^^^
});

我在 qunit 的 github 中看到过这样的例子,所以我想这是正确的,但我可以看到你没有将时间函数设置得足够高的问题。

我已经将所有在 success: 和 error: 中发生的处理移到了 post 函数之外,因此我可以独立于 ajax 调用对其进行测试,但我仍然想测试实际 post 是否存在各种类型的错误。

于 2017-12-03T00:43:44.603 回答