如何用Jest模拟/替换对象的getter函数?

时间:2017-04-29 15:31:17

标签: javascript reactjs mocking sinon jestjs

在Sinon,我可以做到以下几点:

var myObj = {
    prop: 'foo'
};

sinon.stub(myObj, 'prop').get(function getterFn() {
    return 'bar';
});

myObj.prop; // 'bar'

但我怎么能和Jest一样呢? 我不能用jest.fn()覆盖函数,因为它不会取代getter

  

"无法设置get"

的值

3 个答案:

答案 0 :(得分:17)

您可以使用Object.defineProperty

Object.defineProperty(myObj, 'prop', {
  get: jest.fn(() => 'bar'),
  set: jest.fn()
});

答案 1 :(得分:17)

对于任何绊倒这个答案的人来说,Jest 22.1.0引入了spy on getter and setter methods的能力。

编辑:就像下面的scieslak's answer一样,因为你可以监视getter和setter方法,你可以使用Jest模拟它们,就像使用任何其他函数一样:

class MyClass {
  get something() {
    return 'foo'
  }
}

jest.spyOn(MyClass, 'something', 'get').mockReturnValue('bar')
const something = new MyClass().something

expect(something).toEqual('bar')

答案 2 :(得分:5)

OMG我去过这里很多次了。最后找出解决方案。 如果您只在乎间谍。寻找@Franey的答案。但是,如果您实际上需要为getter存根一个值,这就是您可以做到的方式

class Awesomeness {
  get isAwesome() {
    return true
  }
}

describe('Awesomeness', () => {
  it('is not always awesome', () => {
    const awesomeness = new Awesomeness
    jest.spyOn(awesomeness, 'isAwesome', 'get').mockReturnValue(false)

    expect(awesomeness.isAwesome).toEqual(false)
  })
})