Sinon – Stub模块函数,并且不dependency injection地进行testing

我有一个代理模块,将function调用转发到服务。 我想testing是否调用服务函数,当这个代理模块中的函数被调用。

这是代理模块:

const payService = require('../services/pay') const walletService = require('../services/wallet') const entity = { chargeCard: payService.payByCardToken, // ... some other fn } module.exports = entity 

基于这个例子和这个回应 ,我试图存根需要的模块“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() }) }) 

但是testing失败:

  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作为实体的属性,并用函数包装所有东西,testing将通过:

 // 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) 

但是这是代码添加只用于testingpuposes。 有没有一种方法来存根模块的function没有dependency injection和解决方法?

问题在于,在entity已经设置了映射之后,你payService了对payService了存根。

如果你改变你的testing代码,如下所示:

 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() }) }) 

…你应该find那个entity用你的stubbed函数来设置自己,断言通过没问题。