Sinon - 存根模块功能并在没有依赖注入的情况下对其进行测试
Sinon - Stub module function and test it without dependency injection
我有一个代理模块,它将函数调用转发给服务。我想测试服务函数是否被调用,当这个代理模块中的函数被调用时。
这里是代理模块:
const payService = require('../services/pay')
const walletService = require('../services/wallet')
const entity = {
chargeCard: payService.payByCardToken,
// ... some other fn
}
module.exports = entity
基于this example and this response,我尝试对所需模块进行存根 'payService':
const expect = require('expect.js')
const sinon = require('sinon')
const entity = require('../entity')
const payService = require('../../services/pay')
describe('Payment entity,', () => {
it('should proxy functions to each service', () => {
const stub = sinon.stub(payService, 'payByCardToken')
entity.chargeCard()
expect(payService.payByCardToken.called).to.be.ok()
})
})
但测试失败:
0 passing (19ms)
1 failing
1) Payment entity,
should proxy functions to each service:
Error: expected false to be truthy
at Assertion.assert (node_modules/expect.js/index.js:96:13)
at Assertion.ok (node_modules/expect.js/index.js:115:10)
at Function.ok (node_modules/expect.js/index.js:499:17)
at Context.it (payments/test/entity.js:14:56)
那是因为 payService 模块并没有真正存根。我知道如果我将 payService 添加为实体的 属性 并用函数包装所有内容,测试将通过:
// entity
const entity = () => {
return {
payService,
chargeCard: payService.payByCardToken,
// .. some other fn
}
}
// test
const stub = sinon.stub(payService, 'payByCardToken')
entity().chargeCard()
expect(payService.payByCardToken.called).to.be.ok()
// test output
Payment entity,
✓ should proxy functions to each service
1 passing (8ms)
但那只是为了测试目的而添加的代码。有没有办法在没有依赖注入和解决方法的情况下存根模块功能?
问题是在 entity
已经设置了它的映射之后,你存根 payService
太晚了。
如果您像这样更改测试代码:
const expect = require('expect.js')
const sinon = require('sinon')
const payService = require('../../services/pay')
describe('Payment entity,', () => {
let entity
before(() => {
sinon.stub(payService, 'payByCardToken')
entity = require('../entity')
})
it('should proxy functions to each service', () => {
entity.chargeCard()
expect(payService.payByCardToken.called).to.be.ok()
})
})
...您应该会发现 entity
使用存根函数自行设置并且断言通过。
我有一个代理模块,它将函数调用转发给服务。我想测试服务函数是否被调用,当这个代理模块中的函数被调用时。
这里是代理模块:
const payService = require('../services/pay')
const walletService = require('../services/wallet')
const entity = {
chargeCard: payService.payByCardToken,
// ... some other fn
}
module.exports = entity
基于this example and this response,我尝试对所需模块进行存根 'payService':
const expect = require('expect.js')
const sinon = require('sinon')
const entity = require('../entity')
const payService = require('../../services/pay')
describe('Payment entity,', () => {
it('should proxy functions to each service', () => {
const stub = sinon.stub(payService, 'payByCardToken')
entity.chargeCard()
expect(payService.payByCardToken.called).to.be.ok()
})
})
但测试失败:
0 passing (19ms)
1 failing
1) Payment entity,
should proxy functions to each service:
Error: expected false to be truthy
at Assertion.assert (node_modules/expect.js/index.js:96:13)
at Assertion.ok (node_modules/expect.js/index.js:115:10)
at Function.ok (node_modules/expect.js/index.js:499:17)
at Context.it (payments/test/entity.js:14:56)
那是因为 payService 模块并没有真正存根。我知道如果我将 payService 添加为实体的 属性 并用函数包装所有内容,测试将通过:
// entity
const entity = () => {
return {
payService,
chargeCard: payService.payByCardToken,
// .. some other fn
}
}
// test
const stub = sinon.stub(payService, 'payByCardToken')
entity().chargeCard()
expect(payService.payByCardToken.called).to.be.ok()
// test output
Payment entity,
✓ should proxy functions to each service
1 passing (8ms)
但那只是为了测试目的而添加的代码。有没有办法在没有依赖注入和解决方法的情况下存根模块功能?
问题是在 entity
已经设置了它的映射之后,你存根 payService
太晚了。
如果您像这样更改测试代码:
const expect = require('expect.js')
const sinon = require('sinon')
const payService = require('../../services/pay')
describe('Payment entity,', () => {
let entity
before(() => {
sinon.stub(payService, 'payByCardToken')
entity = require('../entity')
})
it('should proxy functions to each service', () => {
entity.chargeCard()
expect(payService.payByCardToken.called).to.be.ok()
})
})
...您应该会发现 entity
使用存根函数自行设置并且断言通过。