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

新手上路,请多包涵

在 Sinon 我可以做以下事情:

 var myObj = {
    prop: 'foo'
};

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

myObj.prop; // 'bar'

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

“无法设置 get 的值”

原文由 I_like_foxes 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 687
2 个回答

你可以使用 Object.defineProperty

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

原文由 Alex Robertson 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Franey 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题