我如何用 jest 配置 jsdom

IT技术 javascript reactjs jestjs jsdom
2021-05-15 17:16:01

我已经将 jest 和 jsdom 安装到我的 react 项目中,但是我在导入使用该window.localStorage变量的 react 组件时遇到了问题我为 jsdom 添加了一个安装文件,我相信它可以解决问题。

这是我的设置:

package.json 中的 jest 配置

"jest": {
    "verbose": true,
    "testEnvironment": "jsdom",
    "testURL": "http://localhost:8080/Dashboard/index.html",
    "transform": {
      "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
      "^.+\\.jsx$": "<rootDir>/node_modules/babel-jest"
    },
    "unmockedModulePathPatterns": [
      "node_modules/react/",
    ],
    "moduleFileExtensions": [
      "js",
      "jsx",
      "json",
      "es6"
    ]
  }

设置.js

import jsdom from 'jsdom';

const DEFAULT_HTML = '<html><body></body></html>';

global.document = jsdom.jsdom(DEFAULT_HTML);

global.window = document.defaultView;
global.navigator = window.navigator;
global.localStorage = window.localStorage;

测试.js

'use strict';
import setup from './setup';
import React from 'react';
import jsdom from 'jsdom';
import Reportlet from '../components/Reportlet.jsx';

it('Ensures the react component renders', () => {

});

我的 reportlet 组件使用 localStorage 变量但大喊:

Cannot read property getItem of undefined 当我打电话 localStorage.getItem(<some item>)

在这里读到jest 随 jsdom 一起提供,但我不确定是否需要额外的 jsdom 依赖项。我还在这里读到 j​​sdom 需要在第一次react之前加载。

有谁知道如何正确配置 jest 与 jsdom?

1个回答

jsdom 不支持 localStorage。看起来您可以使用像“node-localstorage”这样的节点友好存根。请参阅https://github.com/tmpvar/jsdom/issues/1137 上的评论底部

...或者你可以用类似https://github.com/letsrock-today/mock-local-storage 的东西来模拟它

...或者像这里看到的那样滚动你自己的模拟:如何在 JavaScript 单元测试中模拟 localStorage?