2017-02-16 4 views
0

Я использую sinonjs для тестирования моего приложения ajax.как назвать sinon stub yield для функции, зависящей от аргументов

sinon.stub($, 'ajax').yieldsTo('success', 
{ 
    msgtype: 'success', 
    state: 'loggedin' 
}); 

Моя проблема: на основе URL-адреса в AJAX Я хочу отправить аргументы по-разному. Как я могу это достичь?

Если URL в $ .ajax является: /login тогда аргумент 'успеха' должно быть {состояние: 'LoggedIn'}

Если URL в $ .ajax является: /getemail тогда аргумент 'успеха' должно быть { электронная почта: '[email protected]'}

------------ EDIT --------------

мои Аякса аргументы {url: '/ login', type: "POST", data: request_data, success: function (data) {}}

ajaxStub.withArgs({url:'/login'}) не работает.

ответ

2

Опоры Sinon имеют метод stub.withArgs(arg1[, arg2, ...]), который позволяет вам указывать различные типы поведения с различными входными параметрами для одной и той же функции. Поскольку первый параметр $.ajax является URL, вы можете сделать следующее:

const ajaxStub = sinon.stub($, 'ajax'); 
ajaxStub.withArgs('/login').yieldsTo('success', { state: 'loggedin' }); 
ajaxStub.withArgs('/getemail').yieldsTo('success', { email: '[email protected]' }); 

Редактировать

Поскольку вы передаете объект в качестве единственного параметра это, вероятно, не так легко достижимо с withArgs() или даже невозможно , Я думаю, что самый простой способ обойти эту проблему - определить пользовательскую функцию, которая используется вместо $.ajax. К счастью, это очень просто в JavaScript, и sinon позволяет вам предоставить эту функцию замены в качестве третьего параметра в sinon.stub(object, 'method', replaceFunc).

function fakeAjax(obj) { 
    if (obj.url === '/login') { 
    return obj.success({ state: 'loggedin' }); 
    } 
    if (obj.url === '/getemail') { 
    return obj.success({ email: '[email protected]' }); 
    } 
} 

sinon.stub($, 'ajax', fakeAjax); 

Просто убедитесь, что вы вызываете правильные обратные вызовы, когда ваш аргумент соответствует вашим условиям. С помощью этого метода вы даже можете сделать его более конкретным, например, вы также можете проверить, что это на самом деле запрос POST.

+0

Я редактировал вопрос, пожалуйста, вы можете проверить http://stackoverflow.com/users/6447491/michael-jungo – Codeanu

+0

Я обновил ответ в случае предоставления всего объекта в ' $ .ajax'. –

+0

Вы сделали мой день Майкл, спасибо тонну :) – Codeanu

1

Вы можете использовать withArgs с sinon.match. Например:

ajaxStub = sinon.stub(jQuery, 'ajax'); 
ajaxStub.withArgs(sinon.match({ url: 'https://some_url'})).yieldsToAsync('success', responseData); 
Смежные вопросы