Я пытаюсь написать тесты для созданного мной реактивного компонента, который использует navigator.geolocation.getCurrentPosition()
в методе, подобном этому (грубый пример моего компонента):
class App extends Component {
constructor() {
...
}
method() {
navigator.geolocation.getCurrentPosition((position) => {
...code...
}
}
render() {
return(...)
}
}
Я использую приложение create-реагировать, которое включает в себя тест:
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<App />, div);
});
Этот тест не пройден, распечатав это в консоли:
TypeError: Cannot read property 'getCurrentPosition' of undefined
Я новичок в React, но имею небольшой опыт работы с Angular 1.x. В angular обычно макетируют (в рамках тестов в beforeEach) функции, "сервисы" и методы глобальных объектов, такие как navigator.geolocation.etc. Я потратил время на изучение этой проблемы, и этот фрагмент кода - самый близкий, который я мог придумать:
global.navigator = {
geolocation: {
getCurrentPosition: jest.fn()
}
}
Я поместил это в свой тестовый файл для приложения, но это не имело никакого эффекта.
Как я могу "смоделировать" этот метод навигатора и пройти тест?
РЕДАКТИРОВАТЬ: я рассмотрел использование библиотеки под названием геолокации, которая якобы оборачивает navigator.getCurrentPosition
для использования в среде узла. Если я правильно понимаю, jest запускает тесты в среде узлов и использует JSDOM для имитации таких вещей, как window
. Я не смог найти много информации о поддержке JSDOM navigator
. Вышеупомянутая библиотека не работала в моем приложении реакции. Использование специального метода getCurrentPosition вернет только неопределенное значение, даже если сама библиотека была импортирована правильно и доступна в контексте класса App.