2014-12-16 2 views
0

Я пытаюсь заглушить несколько вызовов ajax, но я хочу, чтобы оба они были отправлены и успешно выполнены, возможно ли это?Как я могу заставить sinon уступить нескольким обратным вызовам

Я хочу что-то вроде этого:

var stub = sinon.stub(jQuery, "ajax"); 
stub.onCall(0).yieldsTo("beforeSend").yieldsTo("success", {some: 'data'}); 
stub.onCall(1).yieldsTo("beforeSend").yieldsTo("success", {other: 'stuff'}); 

Но это скачет метод 'beforeSend'.

Я знаю, что это было бы легче разрешить Ajax сделать это fakeServer материал и использовать Синона, но я не могу, как я проверяю в узле с поддельной браузер и он просто doesn't work

ответ

0

я смог обойти это, добавив дополнительный код:

var responses = {}; 
var executionComplete; 

beforeEach(function() { 
    executionComplete = $.Deferred(); 
    sinon.stub($, "ajax", function (options) { 
     if (options.beforeSend) { 
      options.beforeSend(); 
     } 
     completeAjaxCall(options); 
    }); 
}); 

afterEach(function() { 
    $.ajax.restore(); 
}); 

var completeAjaxCall = function (options) { 
    var response = findResponse(options.url, options.type); 
    setTimeout(function() { 
     if (response.code < 400) { 
      if (options.dataFilter && response.data) { 
       response.data = options.dataFilter(JSON.stringify(response.data)); 
      } 
      if (options.success) { 
       options.success(response.data); 
      } 
     } else { 
      if (options.error) { 
       options.error(response.data); 
      } 
     } 
     if (options.complete) { 
      options.complete(); 
     } 
     if (response.completeExecution) { 
      executionComplete.resolve(); 
     } 
    }, response.serverResponseTime); 
}; 

var findResponse = function (url, type) { 
    var response = responses[url]; 
    expect(response, url + ' should have a response').to.exist; 
    expect(response.type).to.equal(type); 
    delete responses[url]; 
    if (Object.keys(responses).length === 0) { 
     response.completeExecution = true; 
    } 
    return response; 
}; 

var givenResponse = function (response) { 
    responses[response.url] = response; 
}; 

Тогда в моем тесте я могу использовать его, как это :

it('should do some stuff', function (done) { 
    //given 
    givenResponse({serverResponseTime: 4, code: 200, url: '/saveStuff', type: 'POST'}); 
    givenResponse({serverResponseTime: 1, code: 200, url: '/getStuff', type: 'GET'}); 

    //when 
    $('button').click(); 

    //then 
    executionComplete.then(function() { 
     expect(something).to.be.true; 
     done(); 
    }); 
}); 
0

Вы можете использовать yieldTo после вызова:

var stub = sinon.stub(); 
stub({ 
    foo: function() { 
     console.log('foo'); 
    }, 
    bar: function() { 
     console.log('bar'); 
    } 
}); 
stub.yieldTo('foo'); 
stub.yieldTo('bar'); 
+0

Да, но это приведет к «foo» и «bar», которые были установлены в тесте. Я хочу уступить функции в методе, который затупился. –

Смежные вопросы