如何使用JASMINE监视多个AJAX调用?

时间:2013-07-09 14:41:44

标签: jquery jasmine

我无法从单个测试规范中窥探多个ajax请求。我想使用JASMINE测试下面的myFirstFunction()mySecondFunction()

function myFirstFunction() {
    $.postJSON('test1.htm', {operation:operation}, function (data) {    
        if (data != null && data.errorMsg != null && data.errorMsg.length > 0) {
            $.populateErrorMessage(data);
        } else { 
            operationAccess = data;
            var tempAccessFlag = operationAccess[0].accessFlag;
            if (tempAccessFlag) {
                mySecondFunction();
            }                  
        }
    });
}

function mySecondFunction(operation, operationAccess, reason) {
        $.postJSON('test2.htm', {windowStart:0, windowSize:4}, function (data) {
            if (data != null && data.errorMsg != null && data.errorMsg.length > 0) {
                $.populateErrorMessage(data);
            } else {
                if (null != data && data.accessFlag == "SUCCESS") {
                    //do something
                } else {
                    //do something
                }
            }
        });
}

我写了以下测试规范&能够窥探第一个postJSON,如下所示 -

it("Test myFirstFunction & mySecondFunction", function () {
        var operation = "customerPreviousOrder";
        var myFirstFunctionData = [{"accessFlag":true}]
        spyOn($, "ajax").andCallFake(function(params) {
            params.success(myFirstFunctionData);
        });
        myFirstFunction();
        expect(<Something>).toEqual(<Something>);

});

我想从上面的测试规范中测试mySecondFunction()。因为myFirstFunction()会调用mySecondFunction()。那我怎么能窥探第二个postJSON?

4 个答案:

答案 0 :(得分:2)

来自Pivotal的人开发并维护Jasmine-Ajax,这为Jasmine添加了AJAX支持,因此您可以测试请求和模拟响应。模拟安装在测试中或beforeEach

jasmine.Ajax.useMock();

测试中的所有请求都已收集并在全局变量ajaxRequests中可用。任何请求都不会返回任何响应。要模拟响应,您必须在测试中调用.response([some data])

所以它会像:

it("Test myFirstFunction & mySecondFunction", function () {
    var myFirstFunctionData = {responseText: '[{"accessFlag":true}]'};
    jasmine.Ajax.useMock();  
    myFirstFunction();
    ajaxRequests[0].response(myFirstFunctionData);  // index depends on the order of the AJAX calls
    expect(<Something>).toEqual(<Something>);

});

注意:有获取最新AJAX请求mostRecentAjaxRequest();的全局方法。当您需要直接访问ajaxRequests的元素时,请添加:

afterEach(function(){
    clearAjaxRequests();
});

答案 1 :(得分:1)

你应该使用sinonJS,其中fake server嘲笑ajax的东西,所以你不必关心它。

var server = sinon.fakeServer.create();
server.respondWith('test1.htm', '[{"accessFlag":true}]');
server.respondWith('test2.htm', 'second answer');
server.autoRespond = true;

myFirstFunction();

答案 2 :(得分:0)

您可以尝试以下问题的虚拟解决方案。

来源功能:

function myFunction(){
 $.ajax({                               //First Ajax Call
    url: <URL1>,
    type: 'POST',
    dataType: 'json',
    data: JSON.stringify(data),
    contentType: "application/json; charset=utf-8",
    async: false,

    success: function (data) {
            … some success statement
    } else {
           var enableCardReaderCall = $.ajax({            //Nested Ajax Call
                    type: 'POST',
                    url: <URL2>,
                    dataType: 'json',
        data: JSON.stringify(data),
                   contentType: "application/json; charset=utf-8",

                    success: function (result) {
    // … some success statement
                    }
              }
 });

}); }

测试套件:

describe("Test Suit", function(){
   beforeEach(function () {
      var fakeData = "hi";
     spyOn($, "ajax").andCallFake(function(params) {            //First Spy On 
        params.success(function(fakeData){
            spyOn($, "ajax").andCallFake(function(params) {     //Nested Spy On
               params.success("there is data")
            })
        });
     });
});
it("Test Function", function() {
    $.myFunction();
});

});

答案 3 :(得分:0)

ajax函数的参数有url值。

describe("Test Suit", function() {
  beforeEach(function() {
    spyOn($, 'ajax').and.callFake(function(options) {
      if (options.url === 'test1.htm') {
        options.success([{"accessFlag":true}]);
      } else {
        options.success('second answer'); 
      }
    });
  });
  it("Test myFirstFunction & mySecondFunction", function () {
    myFirstFunction();
    expect(<Something>).toEqual(<Something>);
  }
});