как вызвать sinon stub yieldsTo функцию в зависимости от аргументов

Я использую sinonjs для тестирования своего приложения ajax.

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

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

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

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

------------РЕДАКТИРОВАТЬ--------------

мои аргументы ajax: {url: '/login', тип: "POST", данные: request_data, успех: функция (данные){}}

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


person Anurag    schedule 16.02.2017    source источник


Ответы (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.

person Michael Jungo    schedule 16.02.2017
comment
Я отредактировал вопрос, не могли бы вы проверить stackoverflow.com/users/6447491/michael-jungo - person Anurag; 16.02.2017
comment
Я обновил ответ на случай предоставления только объекта $.ajax. - person Michael Jungo; 16.02.2017
comment
Михаил, sinon.stub($, 'ajax', fakeAjax); не отправляет в функцию fakeAjax. Что мне нужно сделать с этой заглушкой, чтобы она заработала? - person Anurag; 16.02.2017
comment
После того, как вы заглушили его, вы запускаете свой тестовый код, который вызывает $.ajax, и он должен автоматически отправить его в вашу заглушку. - person Michael Jungo; 16.02.2017
comment
Я делал что-то не так. Моя ошибка, все заработало. Спасибо еще раз. :) - person Anurag; 16.02.2017

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

ajaxStub = sinon.stub(jQuery, 'ajax');
ajaxStub.withArgs(sinon.match({ url: 'https://some_url'})).yieldsToAsync('success', responseData);
person Nguyen Quang Phuong    schedule 15.11.2017