Sinon - Как заставить функцию, которая вызывается косвенно, возвращать что-то

1

Я боролся за то, как я могу смоделировать функцию, чтобы я мог вернуть поддельное значение из этой функции.

У меня есть простой скрипт, который может сделать вызов API, однако этот вызов API имеет два параметра. Один параметр предоставляется через параметр родительской функции, другой - путем вызова другой функции. Возвращаемое значение из этой функции - это то, что мне нужно для насмешки.

Полный код довольно сложен, поэтому я сделал небольшой пример того, что я имею в виду. У меня есть функция makeTheCall. В этой функции я вызываю функцию setParameters.

const setParams = require('setParams.js');

module.exports.makeTheCall = (event) => {
  const params = setParams('GET', '/todos/1');
  const postData = {
    name: event.name,
    location: event.location
  }

  console.log(params); //dynamic params 'method' and 'callpath' are both undefined here (should be 'GET' and '/todos/1')

  return doARequest(params, postData).then((result) => {
    return result;
  }).catch((error) => {
    return error;
  })
}

Функция setParams не так сложна. Он просто возвращает объект, который содержит некоторые статические и некоторые динамические значения.

module.exports.setParams = (method, callPath) => {
  return {
    host: 'jsonplaceholder.typicode.com',
    port: 433,
    method: method,
    path: callPath
  }
}

Теперь вот где интересная роль вступает в игру. Когда пишете простой тест, вызов не может пройти. Это, конечно, потому что он не может разрешить динамические значения method и callPath.

const makeTheCall = require('makeTheCall.js');

it('runs a happy flow scenario', () => {
  const event = {
    name: 'John Doe',
    location: 'Somewhere'
  }

  return makeTheCall(event)
    .then(response => {
      //Do some usefull testing here
    });
});

Мой вопрос заключается в том, как я могу смоделировать возвращаемое значение метода setParams, чтобы он возвращал что-то вроде:

{
  host: 'jsonplaceholder.typicode.com',
  port: 433,
  method: 'GET',
  path: '/todos/1'
}

Таким образом, я могу вызвать мой вызов API в моем тесте, не вызывая ошибки. Я искал насмешки, используя sinon, в частности, заглушки sinon, например:

const params = setParams('GET', '/todos/1');
sinon.stub(params).returns({
  host: 'jsonplaceholder.typicode.com',
  port: 433,
  method: 'GET',
  path: '/todos/1'
});

Однако я думаю, что я что-то упускаю, потому что это не работает. Документация хороша, но после нескольких часов попыток и попыток я начинаю чувствовать себя немного потерянным.

Кто знает/может указать мне правильное направление о том, как смоделировать возвращаемое значение функции setParams? Пример будет высоко оценен.

  • 0
    Вам не нужно издеваться над setParams . Что вы хотите проверить? Из примера, который вы описали, вам нужно doARequest метод doARequest который будет возвращать обещание, основанное на ваших ложных условиях, и проверить, doARequest ли doARequest с params и postData и проверить, возвращает ли он postData ответ или ошибку, основанную на ваших ложных условиях (будь то обещание отклонено или разрешено в методе заглушки doARequest )
Теги:
unit-testing
mocking
sinon

1 ответ

0
Лучший ответ

Вы не называете sinon.stub совершенно правильным. stub() нужен объект и функция, которая является свойством этого объекта. Если вы импортируете с:

 const setParams = require('setParams.js');

Тогда setParams будет объектом modules.export а setParams будет свойством, поэтому вы можете заглушить его примерно так:

let fakeParam = {
    host: 'jsonplaceholder.typicode.com',
    port: 433,
    method: 'GET',
    path: '/todos/1'
}

let paramStub = sinon.stub(params, 'setParams').returns(fakeParam)

На более широкой картине не очень понятно, что вы пытаетесь проверить. С помощью модульных тестов вы обычно пытаетесь свести все к одной маленькой вещи, которую хотите утверждать. Так что в этом случае, возможно, вы захотите заявить, что при вызове makeTheCall doARequest вызывается с параметрами, возвращаемыми из setParams. В этом случае вы также можете doARequest. Затем вы можете утверждать с помощью sinon.calledWith(doARequestStubb, fakeParam). Вы можете разрешить doARequestStubb с обещанием, что код не doARequestStubb.

  • 0
    У меня есть общая идея. У меня все работает, но я не могу понять, как я могу использовать поддельное возвращаемое значение в предложении then / catch обещания. Я открыл отдельную тему для этого здесь . Можете ли вы помочь мне лучше понять эту часть?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню