Sinon-如何制作一个间接调用某些函数的函数

时间:2019-01-03 14:53:41

标签: javascript node.js unit-testing mocking sinon

我一直在努力模拟函数,以便可以从该函数返回假值。

我有一个简单的脚本可以进行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
  }
}

现在,这是有趣的部分开始发挥作用的地方。编写简单测试时,呼叫无法进行。当然,这是因为它无法解析动态值methodcallPath

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函数的返回值?一个例子将不胜感激。

1 个答案:

答案 0 :(得分: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做出承诺,确保代码不会中断。