如何使用 Sinon 处理嵌套函数?
How to address nested functions using Sinon?
在代码中使用 Sequelize,我无法对它的关键内部函数进行 stub,例如 .save()、.scope() 等。嵌套似乎不起作用。
作为单元测试的一部分,如果没有正确处理这些函数,测试就会失败,表示:TypeError: Cannot read property 'returns' of undefined
执行此行时抛出错误:
subscription.save()
存根的实现:
const deleteSubscription = async (subscriptionId) => {
const ts = Math.floor(Date.now() / 1000)
const subscription = await sql.Subscriptions.findByPk(subscriptionId);
if (subscription == null) {
throw new Error('Subscription not found', 'subscription_not_found')
}
subscription.deletedAt = ts
subscription.save()
return subscription
}
单元测试:
it('deleteSubscription succeeds', async () => {
subscriptionsSqlStub.save.returns({})
subscriptionsSqlStub.findByPk.returns({
id: 1
})
const subscription = await subscriptions.deleteSubscription(subscriptionsSqlStub)
expect(subscription).to.have.deep.property('id', 1)
sinon.assert.calledOnce(subscriptionsSqlStub.findByPk)
subscriptionsSqlStub.findByPk.resetHistory()
})
如何处理 inner/nested 函数?
我没有完全尝试过您的代码,但我认为可以通过在 findByPk
的 return 响应中添加 save()
来解决此问题,因此 subscription.save()
存在。
subscriptionsSqlStub.findByPk.returns({
id: 1,
save: () => true // adding save() here
});
希望有用!
在代码中使用 Sequelize,我无法对它的关键内部函数进行 stub,例如 .save()、.scope() 等。嵌套似乎不起作用。
作为单元测试的一部分,如果没有正确处理这些函数,测试就会失败,表示:TypeError: Cannot read property 'returns' of undefined
执行此行时抛出错误:
subscription.save()
存根的实现:
const deleteSubscription = async (subscriptionId) => {
const ts = Math.floor(Date.now() / 1000)
const subscription = await sql.Subscriptions.findByPk(subscriptionId);
if (subscription == null) {
throw new Error('Subscription not found', 'subscription_not_found')
}
subscription.deletedAt = ts
subscription.save()
return subscription
}
单元测试:
it('deleteSubscription succeeds', async () => {
subscriptionsSqlStub.save.returns({})
subscriptionsSqlStub.findByPk.returns({
id: 1
})
const subscription = await subscriptions.deleteSubscription(subscriptionsSqlStub)
expect(subscription).to.have.deep.property('id', 1)
sinon.assert.calledOnce(subscriptionsSqlStub.findByPk)
subscriptionsSqlStub.findByPk.resetHistory()
})
如何处理 inner/nested 函数?
我没有完全尝试过您的代码,但我认为可以通过在 findByPk
的 return 响应中添加 save()
来解决此问题,因此 subscription.save()
存在。
subscriptionsSqlStub.findByPk.returns({
id: 1,
save: () => true // adding save() here
});
希望有用!