Sinon - Как заставить функцию, которая вызывается косвенно, возвращать что-то - PullRequest
0 голосов
/ 03 января 2019

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

У меня есть простой скрипт, который может сделать вызов 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, особенно в заглушках, например:

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

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

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

1 Ответ

0 голосов
/ 03 января 2019

Ты не звонишь 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 решить с обещанием, что код не сломается.

...