javascript - 如何伪造 jquery.ajax() 响应?

标签 javascript jquery ajax unit-testing testing

我正在为进行 AJAX 调用的 JavaScript 编写一些 QUnit 测试。

为了隔离,我覆盖了 $.ajax 以将 AJAX 调用的参数数组写入变量。这可以测试方法如何使用 AJAX 函数,但我很难测试 $.load() 的成功处理程序

来自 http://api.jquery.com/load/ 处的文档:

When a successful response is detected (i.e. when textStatus is "success" or "notmodified"), .load() sets the HTML contents of the matched element to the returned data.

所以我试图返回一个对象,其中包含与成功处理程序的变量同名的对象:

    //Mock ajax function
    $.ajax = function (param) {
        _mockAjaxOptions = param;
        var fakeAjaxSuccess = { responseText: "success", textStatus: "success", XMLHttpRequest: "success" };
        return fakeAjaxSuccess;
    };

但是这种方法并没有奏效。

如何复制成功的 AJAX 调用的行为?

最佳答案

这个问题已经有几年了,对于新版本的 jQuery 已经发生了一些变化。

要用 Jasmin 做到这一点,你可以尝试 Michael Falaga's approach

解决方案

  function ajax_response(response) {
    var deferred = $.Deferred().resolve(response);
    return deferred.promise;
  }

与 Jasmine

  describe("Test test", function() {
    beforeEach(function() {
      spyOn($, 'ajax').and.returnValue(
        ajax_response([1, 2, 3])
      );
    });
    it("is it [1, 2, 3]", function() {
      var response;
      $.ajax('GET', 'some/url/i/fancy').done(function(data) {
        response = data;
      });
      expect(response).toEqual([1, 2, 3]);
    });
  });

没有 Jasmine

  $.ajax = ajax_response([1, 2, 3]);
  $.ajax('GET', 'some/url/i/fancy').done(function(data) {
     console.log(data); // [1, 2, 3]
  });
 

关于javascript - 如何伪造 jquery.ajax() 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272698/

相关文章:

javascript - async.waterfall 未按预期工作

javascript - Angular JS - 当一个数组中特定键中的值也显示为另一个数组中特定键中的值时进行过滤

javascript - jquery slideToggle 的位置

javascript - 在隐藏元素中显示元素

ajax - 如何通过 javascript 和 ajax 调用 Scala 中的方法?

javascript - 提交后如何清空表格

javascript - ReactJS 中的 Zip 文件下载

javascript - HTML5 视频覆盖全屏控制

jquery - jqGrid - 在 jquery 选项卡中打开问题(在 Firefox 和 Google Chrome 上)

javascript - 关于 jquery.ajax() 调用返回的数据的快速问题(已编辑)