Ajax测试代码抛出错误

时间:2016-12-21 11:18:15

标签: javascript ajax jasmine

我正在使用jasmine测试代码并为ajax方法创建模拟对象

spyOn($,'ajax').and.callFake(function(e){
console.log("is hitting");
})

测试以下代码

$.ajax({
               url: AppManager.defaults.contextPath + "/solutions/mcn/mcn-lookup-list",
               data: {
                    mcnNumber       : mcnNumberData,
                    mcnCustomerName : mcnCustomerNameData
               },
               dataType: "json",
               type: "GET",
               global: false
        })
        .done(function(data) {
               solution.CommonObjects.theSolution.orderHandoff.mcnSearchData = self.filterMCNSearchData(data, resultObj);
               $promise.resolve();
        })
        .fail(function() {
             $promise.reject();
             self.displayErrorPopup('MCN Search Error','There is no MCN associated with MCN Number or MCN Customer Name Entered!!!');
        });
    },

它抛出错误无法读取未定义的内容。我是否也需要为此创建一个间谍。请帮助代码执行此操作

1 个答案:

答案 0 :(得分:0)

您的代码问题:

  • 你正在监视它,但是你需要通过你的间谍回复promise个对象。基本上你需要返回这样的东西==> return new $.Deferred().resolve(dummyData).promise();
  • 有多种方法可以创建deferred object/promise object。我建议你阅读Promise& Deferred
  • 您也可以解释一下$promise的来源吗?这是require.js的一些特征吗?

以下是伪造ajax调用的一种方法。

var testObj = {
    ajaxFunction: function() {
      $.ajax({
        url: 'https://jsonplaceholder.typicode.com/posts/1'
      }).done(function(data){
        consoleLogFunction(data);
      });
    }
};

var consoleLogFunction = function(data){
    console.log("The lengh of array is..=> "+ data.length);
};

describe("ajax test suite", function() {
  it("expect true to be true", function() {
    var dummyData = ["Foo", "Boo"];
    spyOn($, 'ajax').and.callFake(function(e){
      return new $.Deferred().resolve(dummyData).promise();
    });
    spyOn(window, 'consoleLogFunction').and.callThrough();
    testObj.ajaxFunction();
    expect(window.consoleLogFunction).toHaveBeenCalledWith(dummyData);
  });
});