当我们在发出新请求之前中止先前的ajax请求并在中止后将其分配回null时,Jasmine会测试一个场景

时间:2015-05-25 06:12:49

标签: jquery ajax jasmine

我有一个实时搜索的场景,我需要在创建一个新的挂起ajax请求之前中止该挂起的ajax请求。虽然我已经编写了下面的代码,但它工作正常。

App.MyNamespace.xhr = null;
App.MyNamespace.makeAjaxRequest = function() {
if (App.MyNamespace.xhr) {
    App.MyNamespace.xhr.abort();
    App.MyNamespace.xhr = null;
 }
App.MyNamespace.xhr = $.ajax({
    type: "GET",
    url: "test.html",
    data: "query",
    });
};

我正在尝试编写一个Jasmine测试,我需要测试我的ajax请求调用中止的场景,并将ajax请求分配回null。我的测试用例如下

describe('#makeAjaxRequest', function() {
  describe('aborts previous ajax request', function() {
    beforeEach(function() {
      App.MyNamespace.xhr = jasmine.createSpyObj('App.MyNamespace.xhr', ['abort']);
      App.MyNamespace.makeAjaxRequest();
     });

    it('calls abort on ajax request', function() {
      expect(App.MyNamespace.xhr.abort).toHaveBeenCalled();
    });

    it('assigns ajax request to null', function() {
      expect(App.MyNamespace.xhr).toBeNull();
    });
   });
});

现在,在上面的测试用例中,第二个语句就是将#jax请求分配给null'通过,但第一个声明,即'调用ajax请求中止'失败并出现以下错误

失败/错误:TypeError:' null'不是一个对象(评估' App.MyNamespace.xhr.abort')

我的假设是,当我们调用myAjaxRequest函数时,jasmine只是检查我们将其赋值为null的最后一个语句。虽然,它的第一个声明,即'在ajax请求中调用abort'如果我没有在实际函数中将App.MyNamespace.xhr请求分配回null,则传递。

我们如何测试这种情况,我可以测试它的两个语句,即它应该在ajax请求上调用abort以及将ajax请求分配回null。

1 个答案:

答案 0 :(得分:0)

解决方法是在调用App.MyNamespace.makeAjaxRequest()函数之前将App.MyNamespace.xhr分配给变量。

describe('#makeAjaxRequest', function() {
  describe('aborts previous ajax request', function() {
    var xhr;

    beforeEach(function() {
      App.MyNamespace.xhr = jasmine.createSpyObj('App.MyNamespace.xhr', ['abort']);
      xhr = App.ModalSearch.xhr;
      App.MyNamespace.makeAjaxRequest();
    });

    it('calls abort on ajax request', function() {
      expect(xhr.abort).toHaveBeenCalled();
    });

    it('assigns ajax request to null', function() {
      expect(App.MyNamespace.xhr).toBeNull();
    });
  });
});