QUnit测试:如何在方法中测试Ajax调用的响应?

时间:2016-08-11 15:43:35

标签: ajax qunit

所以我想测试一个名为' getTheValues'的方法,它进行Ajax调用。我用值嘲笑了服务器响应,但是当我运行测试时,我得到了两次失败,但没有解释他们失败的原因。我在这里做错了什么?

test("Test - call Ajax within method.", function () {
var callback = sandbox.spy();
server.respondWith("GET", "/ajaxtest/getmethod",
                   [200, { "Content-Type": "application/json" },
                    '[{ "id": 123, "name": "John" }]']);

getTheValues();
server.respond();

ok(callback.calledOnce, "Callback was called once");
ok(callback.calledWith([{ id: 123, name: "John" }]), "Callback with correct values.");
});

function getTheValues(callback) {
// do some stuff including an ajax call:

$.ajax({
    type: 'GET',
    dataType: 'json',
    cache: false,
    url: '/ajaxtest/getmethod',
    success: function(data) {
    }    });
}

1 个答案:

答案 0 :(得分:0)

首先是(工作)代码:

QUnit.module('Test Module', {
  before: function () {
    this.server = sinon.fakeServer.create();
  },
  after: function () {
    this.server.restore();
    delete this.server;
  }
});

QUnit.test("Test - call Ajax within method.", function (assert) {
  var callback = sinon.spy(jQuery, "ajax");
  this.server.respondWith("GET", "/ajaxtest/getmethod", /*?id=123&name=-John*/
    [200, { "Content-Type": "application/json" },
      '[{ "id": 123, "name": "John" }]']);

  var a = getTheValues();
  this.server.respond();

  assert.ok(callback.calledOnce, "Callback was called once");
  var callArgs = callback.args[0][0];
  assert.equal(JSON.stringify(callArgs.data), JSON.stringify({ "id": 123, "name": "John" }));
});


function getTheValues() {
  // do some stuff including an ajax call:

  $.ajax({
    data: { id: 123, name: "John" },
    method: 'GET',
    dataType: 'json',
    cache: false,
    url: '/ajaxtest/getmethod',
    success: function (data) {
    }
  });

下一个解释

  1. 这对我来说这不是纯粹的QUnit测试。我假设你也在使用SinonJS。

  2. 关于间谍方法你需要指出什么是间谍

    sinon.spy(jQuery,“ajax”)

  3. 你不能使用callback.calledWith这样返回true / false并且比较对象({} === {})将(几乎)总是返回false。所以这个测试会不断失败。相反,你需要间谍参数(在你的情况下是callback.args [0] [0];)并将特定部分与期望的结果进行比较。有关这方面的更多信息,您可以find here 实际上你不需要提取那些,但我这样做是为了使代码(希望)更清晰。

  4. 所以

    • 第一个提取参数,
    • 接下来strignify对象是可比较的 没有任何其他代码和
    • 然后使用相同的方法进行比较 预期值

    最后你的模拟对象缺少数据对象,将与GET请求一起发送。

    HTH