如何在jest 27中模拟窗口导航器语言

siv3szwd  于 2022-12-08  发布在  Jest
关注(0)|答案(1)|浏览(139)

我有一个函数

export function formatDate(date: string){
    return new Intl.DateTimeFormat(navigator.language).format(new Date(date))
}

我尝试用vanilla jest编写一个单元测试(不使用jsdom库),但是正如您所看到的,我需要能够模拟window.navigator.language
到目前为止我试过了,

test('UK date format', () => {
  Object.defineProperty(window.navigator, 'language', {value: 'en-GB', configurable: true})
  expect(window.navigator.language).toBe('en-GB')
})

但我一辈子都不明白你怎么能开玩笑地嘲笑窗口导航员。
理想情况下,我希望能够在每个测试中模拟一个新的窗口.导航器.语言的值,这样我就可以测试en-USfr
任何帮助,以了解你应该如何嘲笑这将是非常感谢。

mdfafbf1

mdfafbf11#

您可以使用Jest模拟window.navigator.language,如下所示:

let windowSpy: jest.SpyInstance;;

beforeEach(() => {
    // Spy on the read-only window function which
    // returns a reference to the current window.
    windowSpy = jest.spyOn(window, 'window', 'get');
});

// Clean-up the spy after every test
afterEach(() => windowSpy.mockRestore());

const setMockLanguage = (language: string) =>
    // Set how you want window.navigator.language to behave
    windowSpy.mockImplementation(() => ({
        navigator: {
            language
        }
    }));

test('UK date format', () => {
    setMockLanguage('en-GB');

    expect(window.navigator.language).toBe('en-GB');
});

test('US date format', () => {
    setMockLanguage('en-US');

    expect(window.navigator.language).toBe('en-US');
});

我在代码中加入了一些注解以提供帮助。
您可以看到它在here上工作。

相关问题