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函数来设置自己,断言通过没问题。