【问题标题】:Resolve file paths in Jest在 Jest 中解析文件路径
【发布时间】:2018-09-11 23:15:06
【问题描述】:

我有一个基于 React 的应用程序,其中有一个我打算通过 Jest 运行的测试文件。该测试需要从其他文件中导入类。我导入的文件进一步导入其他文件等等。该项目有许多路径的别名,以减少导入它们时的输入(这是在 Webpack 中配置的)。

当我在 npm 中运行 jest 命令时,我收到一条错误消息,提示“找不到模块 ...”。运行 Jest 时如何解析文件路径?我无法模拟这些模块,因为这些是运行测试所需的自定义模块。

【问题讨论】:

    标签: webpack jestjs


    【解决方案1】:

    Jest 可以通过 moduleNameMapper 处理这个问题
    您也可以在此处定义与 webpack 中相同的别名。这应该使 jest 能够解决它们。

    来自文档:

    最后我们只需要处理 webpack 别名。为此我们 可以再次使用 moduleNameMapper 选项。

    // package.json
    {
      "jest": {
        "modulePaths": ["/shared/vendor/modules"],
        "moduleFileExtensions": ["js", "jsx"],
        "moduleDirectories": ["node_modules", "bower_components", "shared"],
    
        "moduleNameMapper": {
          "^react(.*)$": "<rootDir>/vendor/react-master$1",
          "^config$": "<rootDir>/configs/app-config.js",
    
          "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js",
          "\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
        }
      }
    }
    

    https://facebook.github.io/jest/docs/en/webpack.html#configuring-jest-to-find-our-files

    【讨论】:

    • 我不能这样做,因为有很多别名定义为它的一个大项目。而且由于依赖项是递归的,因此很难过滤我的测试所需的那些。
    • 恐怕您必须再次定义它们才能使其正常工作。如果您使用的是打字稿,您还可以尝试在 paths 中添加别名到您的 tsconfig.json 中,但无论哪种方式,您都需要再次定义它们以开玩笑。
    • 我正在尝试这个,但仍然出现错误。我在package.json 中提到过:"moduleNameMapper": { "react-common": C:\...react\common }。我正在导入位于react/common/components 中的组件,例如import {xyz} from 'react-common/components',但它无法解析此路径。是否不能将 jest config 中定义的映射组件路径与映射路径的子路径结合起来?
    • 您还需要像示例"^react(.*)$": "&lt;rootDir&gt;/vendor/react-master$1", 一样使用正则表达式来映射子级。
    【解决方案2】:

    您也可以尝试在 moduleDirectories 中添加别名文件夹

    "moduleDirectories": [
      "src",
      "node_modules"
    ]
    

    当我想使用绝对而不是这样的相对导入时,我会使用这种方法:

    import SomeComponent from 'components/SomeComponent'
    

    注意:我的组件文件夹位于 /src 下

    【讨论】:

      【解决方案3】:

      您可以像这样在您的 Jest 配置文件中添加 1 行:

      module.exports = {
        moduleNameMapper: {
          "^@/(.*)$": "<rootDir>/src/$1"
        }
      }
      

      上面的配置行使用正则表达式来映射以@ 字符开头的导入。

      注意:(以上配置代码假设您的源代码位于“project_root/src/”中

      然后,您在 jest 测试中的导入语句将如下所示:

      import {RepositoryController} from '@/controller/repository'
      

      映射到project_root/src/controller/repository。这比相对路径要好得多:../../../src/controller/repository 我的项目经常需要。

      【讨论】:

      • 如何配置多个路径,如下所示:'import { NxDatepickerComponent } from '@xyz/ngx-ndbx/datefield/xyz-ngx-ndbx-datefield';' '从'@xyz/ngx-ndbx/datefield'导入{NX_DATE_FORMATS};'并在 moduleMap 中使用了以下内容: "^@xyz/(.*)$": "/node_modules/@xyz/$1" 但没有用。你介意在这里指出这个问题吗?我现在正在为此努力工作
      • 我认为您正在寻找模块。源代码中的export 和import 语句来创建模块。开玩笑的 moduleMap 只允许您使用 @xyz 来查找目录,但它需要模块才能成功导入。
      【解决方案4】:

      提醒其他遇到此问题的人:如果您关注了 Jest getting started documentation,并遇到提到的部分:

      生成基本配置文件: 根据您的项目,Jest 会问您几个问题,并将创建一个基本配置文件,其中包含每个选项的简短描述

      并按照该步骤,它将为您生成一个jest.config.js 文件。

      随后的 Jest 文档(和 SO 帖子)然后参考将配置选项放在您的 package.json 中,如果您继续将配置更改放在那里,(例如在这个线程和其他人中建议的那些)Jest 将忽略看看你的jest.config.js吧。

      (如果你像我一样)然后你会用头撞墙,试图弄清楚为什么你添加的配置选项即使在逐步遵循它们之后也不起作用,只是稍后意识到相对空的 jest.config.js 文件正在压缩您一直试图在 package.json 中工作的所有内容,而 Jest 完全忽略了!

      【讨论】:

        【解决方案5】:

        什么对 webpack ^5 有效:

        从 package.json 中删除任何 jest 配置作为 @Eric 上面解释了原因,并将这个属性添加到 jest.config.json 作为 @levibostian 上面建议的:

        moduleNameMapper: {
            '^@/(.*)$': '<rootDir>/src/$1',
        },
        

        【讨论】:

          猜你喜欢
          • 2020-08-08
          • 2014-09-03
          • 2013-06-05
          • 2013-06-04
          • 2014-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-09
          相关资源
          最近更新 更多