【问题标题】:Jasmine, one test, multiple ajax requests ( error: ajax has already been spied upon )Jasmine,一次测试,多个 ajax 请求(错误:ajax 已被监视)
【发布时间】:2023-03-27 03:32:01
【问题描述】:

我有一个触发 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)总长度address-items减2,(当服务器返回一个数字时——这就是mock的症结所在)。

但是,jasmine 抱怨说“ajax 已经被监视了”。有没有办法从 ajax 模拟返回一个新值以完成测试?

【问题讨论】:

    标签: javascript jquery ajax jasmine


    【解决方案1】:

    实际上,我的做法是过度设计的。只是需要一个关闭。不需要我的自定义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);
    
      });
    

    【讨论】:

    • 顺便说一句,如果您将响应函数设置为 return { status: true, id: responses.shift() };,则不需要该 callCount 变量。
    猜你喜欢
    • 2016-07-07
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多