我一直在努力模拟函数,以便可以从该函数返回假值。
我有一个简单的脚本可以进行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 :(得分: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
做出承诺,确保代码不会中断。