尽管调用createStubInstance,为什么调用构造函数?

时间:2018-04-02 17:37:09

标签: node.js sinon

我想阻止在测试期间调用类的构造函数,所以我按照文档使用createStubInstance(MyClass),但构造函数仍然被调用。为什么?

  

如果要创建MyConstructor的存根对象,但不想要   要调用的构造函数,请使用此实用程序函数。

     

var stub = sinon.createStubInstance(MyConstructor)

测试

const sinon = require('sinon')
const Fizz = require('../Fizz')
const Buzz = require('../Buzz')


    describe('Fizz', () => {
      it('should mock the constructor', () => {
        sinon.createStubInstance(Fizz)
        const doStuffFakeFizz = sinon.stub(Fizz.prototype, 'doStuff').returns({ src: 'mock' })
        const buzz = new Buzz()
        buzz.doStuff()
        expect(doStuffFakeFizz.called).toBeTruthy()
      })
    })

巴兹

const Fizz = require('./Fizz')

    class Buzz {
      doStuff() {
        const fizz = new Fizz()
        return fizz.doStuff()
      }
    }
    module.exports = Buzz

嘶嘶声

class Fizz {
  constructor() {
    console.log('CALLED')
    this.thing = { src: 'real' }
  }

  doStuff() {
    return this.thing
  }
}
module.exports = Fizz

1 个答案:

答案 0 :(得分:1)

sinon.createStubInstance无法替换此类引用。它所做的就是为构造函数原型中的每个属性返回一个带有存根的普通对象。您通常会将此对象设置为某个存根的返回值,或者将其作为参数提供给某个地方,以便将其放置到位。

为了实际存根Fizz构造函数,您测试的代码需要通过可替换的引用来调用它。请在此处查看我的回答:

Can ES6 constructors be stubbed more easily with Sinon?