javascript - 如何使用 jasmine 对 jquery ajax 调用进行单元测试?

标签 javascript jquery unit-testing jasmine karma-jasmine

我的 .js 文件中有以下 ajax 调用代码,我想编写 jasmine 单元测试来实现覆盖。

var promise = $.ajax({
                url: URL,
                type: 'GET'
               });
promise.done(function(data, status) {
       console.log("success");
});
promise.fail(function(status, error) {
       console.log("error");
});

我能够通过 stub /模拟数据为 $.ajax 调用编写单元测试用例,但无法为 .done 和 .fail 方法编写测试用例。是否有为 .done 和 .fail 方法编写规范。

最佳答案

  • 您可以从成功/失败处理程序中调用其他函数来有效模拟 Promise 处理程序。
  • 除了使代码易于阅读之外,还有助于调试和模拟
  • Slava Ivanov 的答案可帮助您 stub 适当的回调,它使用 Jquery Deferred对象

以下是我如何稍微修改您的问题以适应模拟行为。查看实际操作 here

var handler = {
  success: function(data) {
    console.log("success");
  },
  fail: function(data) {
    console.log("error");
  }
};
var testObj = {
  ajaxFunction: function() {
    var promise =
      $.ajax({
        url: 'abc',
        type: 'GET'
      });
    promise.done(function(data, status) {
      handler.success(data);
    });
    promise.fail(function(status, error) {
      handler.fail(error);
    });
  }
};

describe('test ajax', function() {
  it('test success', function() {
    spyOn(handler, 'success').and.callFake(function(e) {
      console.log("This is a spy call for success handler");
    });
    spyOn($, 'ajax').and.callFake(function(e) {
      return $.Deferred().resolve({
        'hurray': 'success'
      }).promise();
    });
    testObj.ajaxFunction();
    expect(handler.success).toHaveBeenCalled();
  });

  it('test failure', function() {
    spyOn(handler, 'fail').and.callFake(function(e) {
      console.log("This is a spy call for fail handler");
    });
    spyOn($, 'ajax').and.callFake(function(e) {
      return $.Deferred().reject({
        'alas': 'failure'
      }).promise();
    });
    testObj.ajaxFunction();
    expect(handler.fail).toHaveBeenCalled();
  });

});

关于javascript - 如何使用 jasmine 对 jquery ajax 调用进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44747425/

相关文章:

java - 如何为内存 LDAP 服务器中的 UnboundID 添加/自定义控件

javascript - Angular Testing Controller 导致 TypeError : Object #<Object> has no method '$watch'

javascript - 如何在 Chart.js 中显示工具提示?

javascript - 在 JQuery load() 函数之后,其余的 JavaScript 停止工作

jquery - 我的 getJSON 调用随机返回结果,而不是它们被调用的顺序

ios - Swift - 单元测试中的依赖注入(inject)

javascript - 在 asp.net mvc 中添加 JavaScript 文件

javascript - 用掩码替换每个逗号

javascript - 以编程方式关注移动 safari 中的下一个输入字段

javascript - 如何将 div 制作成 slider ?