如何使用jasmine对jquery ajax调用进行单元测试?

时间:2017-06-25 14:39:57

标签: javascript jquery unit-testing jasmine karma-jasmine

我的.js文件中有ajax调用代码,我想编写jasmine单元测试来覆盖。

var promise = $.ajax({
                url: URL,
                type: 'GET'
               });
promise.done(function(data, status) {
       console.log("success");
});
promise.fail(function(status, error) {
       console.log("error");
});

我能够通过存根/模拟数据为$ .ajax调用编写单元测试用例,但是无法为.done和.fail方法编写测试用例。无论如何都要为.done和.fail方法编写规范。

2 个答案:

答案 0 :(得分:2)

  • 您可以从成功/失败处理程序调用其他函数来有效地模拟promise处理程序。
  • 除了使代码易于阅读外,它还有助于调试和模拟
  • Slava Ivanov的回答可以帮助您查找相应的回调并使用Jquery Deferred对象

以下是我如何略微修改您的问题以适应模拟行为。查看行动here

var handler = {
  success: function(data) {
    console.log("success");
  },
  fail: function(data) {
    console.log("error");
  }
};
var testObj = {
  ajaxFunction: function() {
    var promise =
      $.ajax({
        url: 'abc',
        type: 'GET'
      });
    promise.done(function(data, status) {
      handler.success(data);
    });
    promise.fail(function(status, error) {
      handler.fail(error);
    });
  }
};

describe('test ajax', function() {
  it('test success', function() {
    spyOn(handler, 'success').and.callFake(function(e) {
      console.log("This is a spy call for success handler");
    });
    spyOn($, 'ajax').and.callFake(function(e) {
      return $.Deferred().resolve({
        'hurray': 'success'
      }).promise();
    });
    testObj.ajaxFunction();
    expect(handler.success).toHaveBeenCalled();
  });

  it('test failure', function() {
    spyOn(handler, 'fail').and.callFake(function(e) {
      console.log("This is a spy call for fail handler");
    });
    spyOn($, 'ajax').and.callFake(function(e) {
      return $.Deferred().reject({
        'alas': 'failure'
      }).promise();
    });
    testObj.ajaxFunction();
    expect(handler.fail).toHaveBeenCalled();
  });

});

答案 1 :(得分:0)

要编写.done.fail方法的测试用例,您需要在Spy JQuery函数上创建$.ajax,并调用您自己的假函数Deferred对象并解决/拒绝它取决于您的测试。例如,您的代码可能看起来像......

// successful case
spyOn($, "ajax").and.callFake(function () {
    return $.Deferred().resolve(expected_data, expected_status).promise();
});

// failure case
spyOn($, "ajax").and.callFake(function () {
    return $.Deferred().reject(expected_status, expected_error).promise();
});