代码之家  ›  专栏  ›  技术社区  ›  Top-Master OMG Ponies

Jest在import语句上失败,出现“Unexpected token*”

  •  0
  • Top-Master OMG Ponies  · 技术社区  · 6 年前

    Jest 在简单的导入语句中出现“Unexpected token*”时失败。。。

    错误日志:

    Admin@Admin-PC MINGW32 /d/project (master)
    $ npm run test
    
    > MyApp@0.0.1 test D:\project
    > jest
    
    FAIL __tests__/App-test.tsx
      ? Test suite failed to run
    
        Jest encountered an unexpected token
    
        This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.
    
        By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".
    
        Here's what you can do:
         • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
         • If you need a custom transformation specify a "transform" option in your config.
         • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
    
        You'll find more details and examples of these config options in the docs:
        https://jestjs.io/docs/en/configuration.html
    
        Details:
    
        D:\project\node_modules\react-navigation-tabs\src\navigators\createBottomTabNavigator.js:3
        import * as React from 'react';
               ^
    
        SyntaxError: Unexpected token *
    
          14 | // );
          15 |
        > 16 | export default createBottomTabNavigator({
             |                ^
          17 |   map: {
          18 |     screen: MapView,
          19 |     navigationOptions: {
    
          at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:471:17)
          at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:513:25)
          at Object.get createBottomTabNavigator [as createBottomTabNavigator] (node_modules/react-navigation-tabs/src/index.js:9:12)
          at Object.<anonymous> (src/app/main.view.tsx:16:16)
    
    FAIL src/component/reinput/example/__tests__/index.ios.js (19.352s)
      ? Console
    
        console.error node_modules/react-native/Libraries/YellowBox/YellowBox.js:59
          Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
    
      ? renders correctly
    
        Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
    
          at invariant (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:55:15)
          at createFiberFromTypeAndProps (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2054:11)
          at createFiberFromElement (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2075:15)
          at reconcileSingleElement (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:4605:23)
          at reconcileChildFibers (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:4662:35)
          at reconcileChildren (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:6329:28)
          at updateHostRoot (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:6741:5)
          at beginWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:7566:14)
          at performUnitOfWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11234:12)
          at workLoop (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11266:24)
    
    FAIL src/component/reinput/example/__tests__/index.android.js (19.365s)
      ? Console
    
        console.error node_modules/react-native/Libraries/YellowBox/YellowBox.js:59
          Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
    
      ? renders correctly
    
        Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
    
          at invariant (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:55:15)
          at createFiberFromTypeAndProps (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2054:11)
          at createFiberFromElement (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:2075:15)
          at reconcileSingleElement (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:4605:23)
          at reconcileChildFibers (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:4662:35)
          at reconcileChildren (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:6329:28)
          at updateHostRoot (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:6741:5)
          at beginWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:7566:14)
          at performUnitOfWork (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11234:12)
          at workLoop (node_modules/react-test-renderer/cjs/react-test-renderer.development.js:11266:24)
    
    Test Suites: 3 failed, 3 total
    Tests:       2 failed, 2 total
    Snapshots:   0 total
    Time:        22.774s
    Ran all test suites.
    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! MyApp@0.0.1 test: `jest`
    npm ERR! Exit status 1
    npm ERR!
    npm ERR! Failed at the MyApp@0.0.1 test script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
    
    npm ERR! A complete log of this run can be found in:
    npm ERR!     C:\Users\Admin\AppData\Roaming\Roaming\npm-cache\_logs\2019-04-22T11_52_36_984Z-debug.log
    

    package.json 文件:

    {
      "name": "MyApp",
      "version": "0.0.1",
      "private": true,
      "scripts": {
        "start": "node node_modules/react-native/local-cli/cli.js start",
        "test": "jest"
      },
      "dependencies": {
        "react": "16.8.3",
        "react-native": "0.59.4",
        "react-native-gesture-handler": "^1.1.0",
        "react-native-reanimated": "^1.0.1",
        "react-native-splash-screen": "^3.2.0",
        "react-navigation": "^3.8.1",
        "react-navigation-tabs": "^2.1.1"
      },
      "devDependencies": {
        "@babel/core": "^7.4.3",
        "@babel/runtime": "^7.4.3",
        "@types/jest": "^24.0.11",
        "@types/react": "^16.8.13",
        "@types/react-dom": "^16.8.4",
        "@types/react-native": "^0.57.46",
        "@types/react-test-renderer": "^16.8.1",
        "babel-jest": "^24.7.1",
        "jest": "^24.7.1",
        "metro-react-native-babel-preset": "^0.53.1",
        "react-test-renderer": "16.8.3",
        "typescript": "^3.4.3"
      },
      "jest": {
        "preset": "react-native"
      }
    }
    

    babel.config.js 文件:

    module.exports = {
      presets: ['module:metro-react-native-babel-preset'],
    };
    

    jest.config.js

    module.exports = {
      preset: 'react-native',
      moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
    }
    

    注意:我正在使用 react-native 键入脚本模板,如 react-native init MyApp --template typescript

    0 回复  |  直到 6 年前
        1
  •  64
  •   Top-Master OMG Ponies    6 年前

    一些 react-native

    Jest

    这个 博士关于 Testing React Native Apps compiling dependencies that don't ship pre-compiled code .

    你得告诉我 开玩笑 react-navigation-tabs 通过在 transformIgnorePatterns 您的选择 开玩笑

    更改 jest.config.js 文件如下,修复了OP中提到的问题。

    “但是” react-native-reanimated “模块(需要本机集成,如中所述 another post )需要进一步的工作,我们应该 Mock 具有此类本机需求的模块。。。

    module.exports = {
      preset: 'react-native',
      moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
      transformIgnorePatterns: [
        "node_modules/(?!(react-native"
          + "|react-navigation-tabs"
          + "|react-native-splash-screen"
          + "|react-native-screens"
          + "|react-native-reanimated"
        + ")/)",
      ],
    }
    

    注:以下为 转换模式 选项(这是一个正则表达式数组)最初是用来排除正在编译的文件,但使用 (?!(some-dir-name|another-name)) 图案(the pattern) (?!...) ,消极的,向前看),我们确实告诉你 开玩笑 排除 node_modules 目录,除了我们指定的名称。

        2
  •  10
  •   MoOx    4 年前

    这里有一个正则表达式,我在很多项目中使用它

      "jest": {
        "preset": "react-native",
        "transformIgnorePatterns": [
          "node_modules/(?!(jest-)?react-native|react-(native|universal|navigation)-(.*)|@react-native-community/(.*)|@react-navigation/(.*)|bs-platform|(@[a-zA-Z]+/)?(bs|reason|rescript)-(.*)+)"
        ]
      }
    

    bs-platform )例如,when不是由以前的模式捕获的。

        3
  •  6
  •   alanionita    4 年前

    我在React+Typescript应用程序上遇到了类似的问题。

    我犯的第一个错误是定义 jest.config.js 作为 jest.config.ts

    在节点v12.0上运行

    // jest.config.js
    
    module.exports = {
      preset: "ts-jest",
      testEnvironment: "node",
      roots: ["./src"],
      transform: { "\\.ts$": ["ts-jest"] },
      testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
      moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
      globals: {
        "ts-jest": {
          tsConfig: {
            // allow js in typescript
            allowJs: true,
          },
        },
      },
    };
    
    
    
    // tsconfig.json
    {
      "compilerOptions": {
        "target": "es5",
        "lib": ["dom", "dom.iterable", "esnext"],
        "allowJs": true,
        "skipLibCheck": true,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "strict": true,
        "forceConsistentCasingInFileNames": true,
        "module": "esnext",
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "isolatedModules": true,
        "noEmit": true,
        "jsx": "react",
        "baseUrl": "."
      },
      "include": ["src"],
      "exclude": ["node_modules", "**/*.spec.ts"]
    }
    
    
    // package.json
    "devDependencies": {
        "@types/jest": "^26.0.5",
        "jest": "^26.1.0",
        "ts-jest": "^26.1.3"
    }
    
    
        4
  •  1
  •   Vladyn    5 年前

    在配置文件(.babelrc.js或package.json)的某个地方,必须将“presets”下的“modules”设置为 “amd”|“umd”|“systemjs”|“commonjs”|“cjs”|“auto”| false .

    推荐人 this fragment 从文档中

    像这样:

        "presets": [
      [
        "@babel/preset-env", {
          "targets": process.env.BABEL_TARGET === 'node' ? {
            "node": 'current'
          } : {
            "browsers": [ "last 2 versions" ]
          },
          "loose": true,
          "modules": 'commonjs'
        }
      ]
    ]
    
        5
  •  0
  •   OffensivelyBad    4 年前

    react-native-web 预设到my jest.config.js:

    module.exports = {
    transform: {
      '^.+\\.tsx?$': 'ts-jest',
    },
    timers: 'fake',
    testPathIgnorePatterns: [
      '<rootDir>/build/',
      '<rootDir>/node_modules/',
      '<rootDir>/rndemo/build/',
    ],
    globals: {
      'ts-jest': {
        diagnostics: {
          warnOnly: true,
        },
      },
    },
    preset: 'react-native-web',
    }