如何模拟ajax调用Jasmine测试

时间:2016-04-11 15:59:47

标签: javascript jquery ajax unit-testing jasmine

这是我的代码:

function sendRequestData(url, urlParameters) {
$.ajax({
    url : url,
    method : 'POST',
    headers : {
        'Accept' : 'application/json'
    },
    contentType : 'application/json',
    data : JSON.stringify(urlParameters),
    dataType : "json",
    success : function(data) {
        successCallBack(data)
    },
    error : function(data, status, errorThrown) {
        failCallBack(data, status, errorThrown)
    }
});

我想模拟并测试这个ajax调用。无论如何我能做到吗?

1 个答案:

答案 0 :(得分:-1)

如果您的测试很难测试,这意味着您做错了。

在您的具体情况下,您需要按照Dependency Inversion principle(认为依赖注入)和注入您的要求进入您的功能。基本上,您需要传递所有依赖项,包括$successCallbackfailCallback。这将允许您使用Jasmine的spyOn()方法模拟您的ajax调用,然后检查函数调用是否正确。

function sendRequestData(url, urlParameters, $, successCallBack, failCallBack) {
  $.ajax({
    url : url,
    method : 'POST',
    headers : {
        'Accept' : 'application/json'
    },
    contentType : 'application/json',
    data : JSON.stringify(urlParameters),
    dataType : "json",
    success : function(data) {
        successCallBack(data)
    },
    error : function(data, status, errorThrown) {
        failCallBack(data, status, errorThrown)
    }
  });
}

您的测试可能如下所示。我没有检查过,但你知道我的意思。

describe("sendRequestData() does correct ajax calls", function() {
  var $ok, $error, successCallback, failCallback = null;

  beforeEach(function() {
    // You can create a spy object using this syntax
    $ok = jasmine.createSpyObj('$', ['ajax']);

    // Or define it yourself like so
    $ok = {
      ajax: function(value) {
        successCallback();
      }
    };

    $error = {
      ajax: function(value) {
        failCallback();
      }
    };

    spyOn($, 'ajax');
    spyOn(successCallback);
    spyOn(failCallback);
  });

  it("calls successCallback on success", function() {
    sendRequestData('url', {}, $ok, successCallback, failCallback);
    expect($.ajax).toHaveBeenCalled();
    expect(successCallback).toHaveBeenCalled();
    expect(failCallbackCallback).not.toHaveBeenCalled();
  });

  it("calls failCallback on failure", function() {
    sendRequestData('url', {}, $error, successCallback, failCallback);
    expect($.ajax).toHaveBeenCalled();
    expect(successCallback).not.toHaveBeenCalled();
    expect(failCallbackCallback).toHaveBeenCalled();
  });
});

或者只是使用jasmine-ajax插件来模拟您的ajax调用。