Почему я не могу издеваться над глобальными переменными напрямую с помощью jest.fn() в react?

#reactjs #jestjs

#reactjs #jestjs

Вопрос:

Я знаю, как издеваться над глобальными переменными с помощью Jest, но дело в том, что я не знаю, почему его нельзя издеваться с помощью прямого присваивания jest.fn() .

Кто-нибудь может сказать мне, почему window.loaction = jest.fn() это приведет к ошибке?

Комментарии:

1. Добро пожаловать в Stack Overflow. Пожалуйста, добавьте краткое описание, код, ошибки ваших поисковых / исследовательских работ, как предлагается.

Ответ №1:

Некоторые глобальные переменные доступны только для чтения по спецификации, location это одна из них. Jest использует jsdom для поддельного DOM и в некоторой степени следует спецификации.

Создавать функцию ошибочно location , потому что она должна быть объектом.

Плохая практика издеваться над методами с присваиванием типа ... = jest.fn() , потому что это мешает использовать макет восстановления Jest. При необходимости исходное значение необходимо восстанавливать вручную, иначе оно теряется для всего теста. jest.spyOn всегда предпочтительнее.

location должно быть определено как get средство доступа:

 jest.spyOn(window, 'location', 'get').mockReturnValue({ ... });
  

global.location и window.location взаимозаменяемы, потому global === window что в среде Jest по умолчанию.

Комментарии:

1. Большое вам спасибо за то, что поделились этим ответом. Я боюсь, что в последнем предложении есть небольшая ошибка, потому что один из глобалов должен быть окном. Но это не большая проблема, и еще раз спасибо!