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

IT技术 javascript reactjs mocking sinon jestjs
2021-04-27 07:58:24

在诗浓我可以做到以下几点:

var myObj = {
    prop: 'foo'
};

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

myObj.prop; // 'bar'

但是我怎么能用 Jest 做同样的事情呢?我不能只是用类似的东西覆盖函数jest.fn(),因为它不会取代吸气剂

“无法设置get的值”

3个回答

对于遇到此答案的任何其他人,Jest 22.1.0 引入了监视 getter 和 setter 方法的能力

编辑:就像下面scieslak 的回答一样,因为您可以监视 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')

你可以用 Object.defineProperty

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

天哪,我来过这里很多次了。最后找出正确的解决方案。如果您只关心间谍活动。去找@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)
  })
})