javascript - Jasmine,一次测试,多次ajax请求(错误: ajax has already been spied upon )

标签 javascript jquery ajax jasmine

我有一个触发ajax请求的Jasmine 2.0.2测试,但是每次触发请求时,模拟ajax返回应该是一个特定的返回值。

  var setUpDeleteEventInAjax = function(spyEvent, idToReturn){
    var spy;
    spy = jasmine.createSpy('ajax');
    spyAjaxEvent = spyOnEvent(spyEvent, 'click');
    spyOn($, 'ajax').and.callFake(function (param) {
      return {
        id: idToReturn,  // here I am trying to return a defined value
        status: true
      };
    });
    spyAjaxEvent.reset();  //  this should reset all ajax evetns
  };

...
beforeEach(function(){...})
afterEach(function(){...})
...

it('Deleting all the addresses should reveal the form', function () {

    setUpDeleteEventInAjax('#delete',52670);
    $('#delete').click();
    expect($('.address-item').length).toEqual(4);

    setUpDeleteEventInAjax('#delete-2',52671);
    $('#delete-2').click();
    expect($('.address-item').length).toEqual(2);

    setUpDeleteEventInAjax('#delete-3',52672);
    $('#delete-3').click();
    expect($('.address-item').length).toEqual(0);

  });
...

点击删除按钮(delete,delete-2,delete-3)后,地址项的总长度减少了2,(当服务器返回一个数字时 - 这是模拟的关键)。

然而, Jasmine 提示“ajax 已经被监视”。有没有办法从 ajax 模拟返回新值来完成测试?

最佳答案

实际上我的处理方式是过度设计的。只是需要一个关闭。不需要我的自定义 setUpDeleteEventInAjax 函数

  it('Deleting all the addresses should reveal the form', function () {
    var responses = [52670, 52671, 52672];
    var ajaxResponses = function () {
      return {
        status: true,
        id: responses.shift()
      }
    };
    spyOn($, 'ajax').and.callFake(ajaxResponses);

    $('#delete').click();
    expect($('.address-item').length).toEqual(4);

    $('#delete-2').click();
    expect($('.address-item').length).toEqual(2);
    expect($('.address-book')).toHaveClass('single-address');

    $('#delete-3').click();
    expect($('.address-item').length).toEqual(0);

  });

关于javascript - Jasmine,一次测试,多次ajax请求(错误: ajax has already been spied upon ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303715/

相关文章:

jquery - 如何使用bootstrap进行分页

php - Dropzone.js - 显示服务器上的现有文件

javascript - 带闭包的回调中参数的范围

javascript - Bootstrap 搞乱了未定义的 div

javascript - 如何使用 Mapbox API 中的 Jquery 从事件 li > a 获取值?

javascript - jQuery - <option> 被添加到 <select> 内部和之后

javascript - 在没有 Canvas 的 2 个元素之间绘制一条线的动画,通过 ID 链接

mysql - 用于检查数据库更新的 Socket.io

javascript - 如何在 ruby​​ on rails 中为复选框设置值?

javascript - 发布订阅好像不起作用