Как смоделировать window.navigator.language, используя шутку - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь смоделировать атрибут window.navigator.language в браузере в моих модульных тестах jest, чтобы я мог проверить, что контент на моей странице использует правильный язык

Я нашел людей онлайн, использующих это:

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

Я установил его прямо в верхней части моего файла теста, и он работает там

однако, когда я переопределяю в отдельном тесте (и людейчтобы убедиться, что для 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')
})

для этих тестов это не меняет языкна новый язык, который я установил, всегда используя тот, что вверху

1 Ответ

0 голосов
/ 18 октября 2018

window.navigator и его свойства доступны только для чтения, поэтому для установки window.navigator.language необходимо Object.defineProperty.Он должен работать для изменения значения свойства несколько раз.

Проблема в том, что компонент уже создан в beforeEach, window.navigator.language изменения не влияют на него.

Использование Object.defineProperty для насмешливых свойств вручную потребуется сохранить оригинальный дескриптор и восстановить его вручную.Это можно сделать с помощью jest.spyOn.jest.clearAllMocks() не поможет для ручных шпионов / издевательств, оно может быть ненужным для шпионов-шуток.

Вероятно, должно быть:

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')
})
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...