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

问题描述 投票:12回答:3

在Sinon,我可以做以下事情:

var myObj = {
    prop: 'foo'
};

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

myObj.prop; // 'bar'

但是我怎么能和Jest一样呢?我不能用jest.fn()之类的东西覆盖这个函数,因为它不会取代getter

“无法设置get的值”

javascript reactjs mocking sinon jestjs
3个回答
19
投票

你可以使用Object.defineProperty

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

24
投票

对于任何绊倒这个答案的人来说,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')

5
投票

天啊我来过这么多次。最后找出适当的解决方案。如果你只关心间谍活动。去找@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)
  })
})
© www.soinside.com 2019 - 2024. All rights reserved.