如何在茉莉花中测试Ajax的已完成部分

时间:2018-12-01 05:59:30

标签: javascript jquery ajax jasmine

总体上来说,我真的很喜欢this resource用于AJAX,并且它可以测试AJAX参数中的successerror函数。

但是,当我选择不带$.ajax({ ... success: ... })并选择不带.done()时,我不确定如何测试。请帮助修改我的简单规格,谢谢!

代码

function itWorked() {}

function sendRequest(callbacks, configuration) {
  $.ajax({}).done(function(response) {
    itWorked()
  });
}

规范

fdescribe("Ajax Tests", function() {
  beforeEach(function() {
    spyOn(window, "itWorked")
    deferred = $.Deferred().done(function() { })
    spyOn($, "ajax").and.callFake(deferred)
    sendRequest()
  })
  it("should work", function() {
    expect($.ajax).toHaveBeenCalled() // pass
    expect(window.itWorked).toHaveBeenCalled(); // fail
  });
});

1 个答案:

答案 0 :(得分:0)

好吧,问题的示例可能与您在本地运行的示例不同,但是它应该在行spyOn($, "ajax").and.callFake(deferred)中失败,因为callFake需要一个函数,而deferred不是。相反,deferred应该是已解决的承诺,并使用.and.returnValue而不是.and.callFake

这是一个可行的示例:

  function itWorked() {
    console.log("It worked!!");
  }

  function sendRequest(callbacks, configuration) {
    $.ajax({}).done(function(response) {
      itWorked();
    });
  }

  describe("Ajax Tests", () => {

    beforeEach(function() {
      spyOn(window, "itWorked").and.callThrough();
      deferred = $.Deferred().resolve(); // Call resolve
      spyOn($, "ajax").and.returnValue(deferred); // Use return value
      sendRequest();
    });

    it("should work", function() {
      expect($.ajax).toHaveBeenCalled(); // pass
      expect(window.itWorked).toHaveBeenCalled(); // pass
    });
  });

请注意,我已经添加了console.log("It worked!!");并使用.and.callThrough();只是在控制台中再次检查是否记录了“有效!”

在调用$.Deferred().resolve()时,您可以传递一个 mocked 响应,以在.done.then回调中进行处理。类似于.resolve({ success: true })Check an example here

希望有帮助