如果我需要一个函数,如何在sinon中存根/模拟它?
const { getLastYearData } = require('../../services')
module.exports = async lastYearInfo => {
return getLastYearData(lastYearInfo)
}
如果我这样做,它可以工作,但我无法在不引用对象的情况下使其工作。
const services = require('../../services')
module.exports = async lastYearInfo => {
return services.getLastYearData(lastYearInfo)
}
和
const { expect } = require('chai')
const lastYearFunction = require('./last-year-function')
const sinon = require('sinon')
const services = require('../../services')
it('should return stubbed values', async () => {
sandbox
.stub(services, 'getLastYearData')
.callsFake(lastYearInfo => {
return { Data: 4 }
})
let data = await lastYearFunction({test: 1})
const expected = {
Data: 4
}
expect(data).to.deep.equal(expected)
})
答案 0 :(得分:2)
这是节点模块工作方式引入的限制。
这一行:
const lastYearFunction = require('./last-year-function')
执行./last-year-function.js
中的代码,然后执行此行:
const { getLastYearData } = require('../../services')
执行../../services.js
中的代码,并将结果的lastYearFunction
属性分配给模块范围中的新变量。所有这一切都发生在sinon有你的存根之前,所以无论如何,模块中的getLastYearData
将引用服务返回的原始函数。
虽然可以在创建存根之后将需要./last-year-function
的行移动到某个时间,但我不建议这样做。首先,如果需要,将无法恢复原始功能。更糟糕的是,要求结果缓存在Node中,因此在同一次运行中需要./last-year-function
的任何内容也会使用存根。或者,将使用原始,取决于运行的顺序。它很不稳定,所以我不推荐它。
您最好的选择就是按照第二个样本的方式进行。通过服务对象引用它,并在afterEach
或某些内容中恢复它。
库用于代理require
调用,这是使您的第一个代码示例工作的唯一方法。我过去使用的是proxyquire。如果你愿意,可以试一试,但根据我的经验,这不值得额外的复杂性。
答案 1 :(得分:0)
docs显示间谍myFunc
var spy = sinon.spy(myFunc);
{/ 1}}。