首页 > 解决方案 > 如何在茉莉花中测试完成的ajax部分

问题描述

我真的很喜欢这个 AJAX 资源,它适用于测试 AJAX 参数中的一个successerror函数。

但是,当我选择没有 a$.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
  });
});

标签: javascriptjqueryajaxjasmine

解决方案


好吧,问题中的示例可能与您在本地运行的示例不同,但它应该在行中失败,spyOn($, "ajax").and.callFake(deferred)因为callFake期望一个函数而deferred不是。相反,deferred应该是一个已解决的 Promise并使用.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()时,您可以传递一个模拟响应以在您的或回调中处理。类似的东西。在此处查看示例.done.then.resolve({ success: true })

希望能帮助到你


推荐阅读