代码之家  ›  专栏  ›  技术社区  ›  joe

npm测试很好,但它也会在askbackend referenceerror:localstorage未定义时引发错误

  •  2
  • joe  · 技术社区  · 8 年前

    我现在开始在reactjs应用程序中测试我的reducer。我用 localStorage .

    utils.js

    export const getAuthToken = () => {
      return localStorage.getItem('authToken');
    };
    
    export const setAuthToken = (token) => {
      localStorage.setItem('authToken', token);
    };
    
    export const removeAuthToken = () => {
      localStorage.removeItem('authToken');
    };
    
    export const prepareJWTHeader = (token) => {
      return 'JWT ' + token
    };
    

    软件:
    npm: 5.6.0
    node: v9.2.0
    package.json

    {
      "name": "f1",
      "version": "0.1.0",
      "private": true,
      "dependencies": {
        "@amcharts/amcharts3-react": "^3.1.0",
        "ajv": "^6.5.0",
        "amcharts3": "^3.21.12",
        "antd": "^3.6.1",
        "axios": "^0.18.0",
        "bootstrap": "^4.1.1",
        "jquery": "^3.3.1",
        "lodash": "^4.17.10",
        "npm-check-updates": "^2.14.2",
        "react": "^16.4.0",
        "react-bootstrap": "^0.32.1",
        "react-dom": "^16.4.0",
        "react-live": "^1.10.1",
        "react-redux": "^5.0.7",
        "react-router-bootstrap": "^0.24.4",
        "react-router-dom": "^4.2.2",
        "react-scripts": "1.1.1",
        "react-tabs": "^2.2.2",
        "reactstrap": "^6.0.1",
        "recharts": "^1.0.0-beta.10",
        "redux": "^3.7.2",
        "redux-form": "^7.2.3",
        "redux-saga": "^0.16.0",
        "semantic-ui-css": "^2.3.1",
        "semantic-ui-react": "^0.80.2"
      },
      "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test --env=jsdom",
        "eject": "react-scripts eject"
      }
    }
    

    我的项目是从 create-react-app . 它的版本是 1.4.3 在我的项目中我已经检查过这个 answer ,但我不明白。为什么我还是会犯这个错误

    这是我跑步的终点站 npm test

    PASS  src/App.test.js
      ✓ renders without crashing (4ms)
    
    Test Suites: 1 passed, 1 total
    Tests:       1 passed, 1 total
    Snapshots:   0 total
    Time:        0.295s, estimated 8s
    Ran all test suites.
    
      console.error node_modules/redux-saga/lib/internal/utils.js:240
        uncaught at askBackend ReferenceError: localStorage is not defined
            at Object.<anonymous>.exports.removeAuthToken (/Users/sarit/study/HT6MInterface/f1/src/utils.js:34:3)
            at Object.<anonymous>.exports.VerifyTokenReducer (/Users/sarit/study/HT6MInterface/f1/src/containers/reducers.js:20:34)
            at combination (/Users/sarit/study/HT6MInterface/f1/node_modules/redux/lib/combineReducers.js:133:29)
            at dispatch (/Users/sarit/study/HT6MInterface/f1/node_modules/redux/lib/createStore.js:178:22)
            at /Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/middleware.js:72:22
            at dispatch (/Users/sarit/study/HT6MInterface/f1/node_modules/redux/lib/applyMiddleware.js:45:18)
            at /Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/utils.js:265:12
            at /Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/proc.js:500:52
            at exec (/Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/scheduler.js:25:5)
            at flush (/Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/scheduler.js:66:5)
            at asap (/Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/scheduler.js:39:5)
            at Array.<anonymous> (/Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/channel.js:197:27)
            at Object.emit (/Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/channel.js:38:13)
            at /Users/sarit/study/HT6MInterface/f1/node_modules/redux-saga/lib/internal/middleware.js:73:21
            at Object.validateToken (/Users/sarit/study/HT6MInterface/f1/node_modules/redux/lib/bindActionCreators.js:7:12)
            at new Container (/Users/sarit/study/HT6MInterface/f1/src/containers/components/Container.js:37:16)
            at constructClassInstance (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:11333:18)
            at updateClassComponent (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:13036:7)
            at beginWork (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:13715:14)
            at performUnitOfWork (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:15741:12)
            at workLoop (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:15780:24)
            at renderRoot (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:15820:7)
            at performWorkOnRoot (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16437:22)
            at performWork (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16358:7)
            at performSyncWork (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16330:3)
            at requestWork (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16230:5)
            at scheduleWork$1 (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16096:11)
            at scheduleRootUpdate (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16663:3)
            at updateContainerAtExpirationTime (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16690:10)
            at updateContainer (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16717:10)
            at ReactRoot.Object.<anonymous>.ReactRoot.render (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:17000:3)
            at /Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:17140:14
            at unbatchedUpdates (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:16557:10)
            at legacyRenderSubtreeIntoContainer (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:17136:5)
            at Object.render (/Users/sarit/study/HT6MInterface/f1/node_modules/react-dom/cjs/react-dom.development.js:17195:12)
            at Object.<anonymous>.it (/Users/sarit/study/HT6MInterface/f1/src/App.test.js:7:22)
            at Object.asyncFn (/Users/sarit/study/HT6MInterface/f1/node_modules/jest-jasmine2/build/jasmine-async.js:68:30)
            at resolve (/Users/sarit/study/HT6MInterface/f1/node_modules/jest-jasmine2/build/queueRunner.js:38:12)
            at new Promise (<anonymous>)
            at mapper (/Users/sarit/study/HT6MInterface/f1/node_modules/jest-jasmine2/build/queueRunner.js:31:21)
            at Promise.resolve.then.el (/Users/sarit/study/HT6MInterface/f1/node_modules/p-map/index.js:46:16)
            at <anonymous>
            at process._tickCallback (internal/process/next_tick.js:188:7)
    

    我认为是假阴性警报。如何消除错误信息?

    1 回复  |  直到 8 年前
        1
  •  2
  •   marcel    8 年前

    通常您的代码在浏览器中运行。所以它可以进入 localStorage . 您的测试运行在一个虚拟dom中(用普通javascript创建= jsdom )你可以在 test 脚本: "react-scripts test --env=jsdom" .

    在特定的测试环境中运行测试时,它不知道 本地存储器 .

    你可以试着在测试文件中模拟它。可能是这样的:

    // In localStorageMock.js
    class LocalStorageMock {
      constructor() {
        this.store = {}
      }
    
      clear() {
        this.store = {}
      }
    
      getItem(key) {
        return this.store[key] || null
      }
    
      setItem(key, value) {
        this.store[key] = value
      }
    
      removeItem(key) {
        delete this.store[key]
      }
    }
    
    const localStorageMock = new LocalStorageMock();
    export default localStorageMock;
    
    // in utils.js
    import localStorage from './localStorageMock';
    

    来源:这个类示例来自@dmitry stackoverflow post .

    提示: 在包括 localStorageMock . 如果没有,在浏览器中运行代码时也将使用它。

    编辑: Here 是一个很好的解释,关于如何嘲笑全球的笑话。我认为最好在测试文件中导入mock,而不是 utils.js .