如何使用 jest 模拟 window.navigator.language

2024-02-25

我试图嘲笑window.navigator.language我的玩笑单元测试中浏览器中的属性,以便我可以测试页面上的内容是否使用正确的语言

我在网上发现有人使用这个:

Object.defineProperty(window.navigator, 'language', {value: 'es', configurable: true});

我已将其设置在测试文件的顶部并且它在那里工作

但是,当我在单独的测试中重新定义(并且人们设置为确保可配置设置为 true)时,它不会重新定义它并且只是使用旧值,有谁知道有一种方法可以明确更改它吗?

beforeEach(() => {
    jest.clearAllMocks()
    Object.defineProperty(global.navigator, 'language', {value: 'es', configurable: true});
    wrapper = shallow(<Component {...props} />)
})

  it('should do thing 1', () => {
      Object.defineProperty(window.navigator, 'language', {value: 'de', configurable: true});
      expect(wrapper.state('currentLanguage')).toEqual('de')
    })

it('should do thing 2', () => {
  Object.defineProperty(window.navigator, 'language', {value: 'pt', configurable: true});
  expect(wrapper.state('currentLanguage')).toEqual('pt')
})

对于这些测试,它不会将语言更改为我设置的新语言,始终使用顶部的语言


window.navigator及其属性 https://developer.mozilla.org/en-US/docs/Web/API/Navigator是只读的,这就是原因Object.defineProperty需要设置window.navigator.language。它应该适用于多次改变财产价值。

问题是该组件已经实例化了beforeEach, window.navigator.language更改不影响它。

Using Object.defineProperty对于手动模拟属性,需要存储原始描述符并手动恢复它。这可以通过以下方式完成jest.spyOn. jest.clearAllMocks()对于手动间谍/模拟没有帮助,对于 Jest 间谍来说可能不需要。

很可能应该是:

let languageGetter;

beforeEach(() => {
  languageGetter = jest.spyOn(window.navigator, 'language', 'get')
})

it('should do thing 1', () => {
  languageGetter.mockReturnValue('de')
  wrapper = shallow(<Component {...props} />)
  expect(wrapper.state('currentLanguage')).toEqual('de')
})
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 jest 模拟 window.navigator.language 的相关文章

随机推荐