gpt4 book ai didi

javascript - 如何使用 Jest 模拟 window.navigator.language

转载 作者:行者123 更新时间:2023-11-28 19:51:03 25 4
gpt4 key购买 nike

我试图在我的开 Jest 单元测试中模拟浏览器中的 window.navigator.language 属性,这样我就可以测试我页面上的内容是否使用了正确的语言

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

Object.defineProperty(window.navigator, 'language', {value: 'es', configurable: 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 and its properties是只读的,这就是为什么需要 Object.defineProperty 来设置 window.navigator.language 的原因。它应该适用于多次更改属性值。

问题是组件已经在beforeEach中实例化了,window.navigator.language改变不会影响它。

使用 Object.defineProperty 手动模拟属性将需要存储原始描述符并手动恢复它。这可以通过 jest.spyOn 来完成。 jest.clearAllMocks() 对手动 spy /模拟没有帮助,Jest spy 可能不需要它。

它可能应该是:

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')
})
...

关于javascript - 如何使用 Jest 模拟 window.navigator.language,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52868727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com