我正在尝试为我构建的 React 组件编写测试,该组件navigator.geolocation.getCurrentPosition()
在这样的方法中使用(我的组件的粗略示例):
class App extends Component {
constructor() {
...
}
method() {
navigator.geolocation.getCurrentPosition((position) => {
...code...
}
}
render() {
return(...)
}
}
我正在使用create-react-app,其中包括一个测试:
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()
}
}
我把它放在我的 App 测试文件中,但它没有效果。
我怎样才能“模拟”这个导航器方法并让测试通过?
编辑:我研究了使用名为geolocation的库,该库据称navigator.getCurrentPosition
可以在节点环境中使用。如果我理解正确的话,jest 在节点环境中运行测试并使用 JSDOM 模拟window
. 我没能找到很多关于 JSDOM 对navigator
. 上面提到的库在我的react应用程序中不起作用。即使库本身已正确导入并且在 App 类的上下文中可用,使用特定方法 getCurrentPosition 也只会返回 undefined 。