与Jest一起使用范围包

Arm*_*ndo 4 scope package typescript reactjs jestjs

我正在开发一个带有react-native和typescript的应用程序,并使用Jest进行测试,但是当我使用作用域包(@assets)时遇到问题,Jest无法找到路径并给出错误。

目录结构如下所示:

project/
  assets/
    img/
      foo.png
    package.json
  src/
    Foo.ts
  build/
    Foo.js


// assets/package.json
{
  "name": "@assets" // My @assets scope
}

// build/Foo.js
const image = require('@assets/img/foo.png'); // <- error in Jest
Run Code Online (Sandbox Code Playgroud)

因此,当我开玩笑时:

npm run jest build /

它找不到'@ assets / img / foo.png'并抛出错误:

从'Foo.js'中找不到模块'@ assets / img / logo.png'

如何在Jest中使用范围包?

开玩笑的版本:20.0.4

谢谢

Dan*_*gan 7

对于那些到达这里并在有作用域的组织下使用私有软件包的用户,这就是我的解决方法:

"jest": {
  "moduleNameMapper": {
    "^@org-name/(.*)$": "<rootDir>/node_modules/@org-name/$1/dist/$1.es5.js"
  }
}
Run Code Online (Sandbox Code Playgroud)

假设所有作用域包都具有与其导出模块相似的路径。如果没有,则可以单独指定它们:

"jest": {
  "moduleNameMapper": {
    "^@org-name/package-one$": "<rootDir>/node_modules/org-name/package-one/dist/package.js",
    "^@org-name/package-two$": "<rootDir>/node_modules/org-name/package-two/build/index.js"
  }
}
Run Code Online (Sandbox Code Playgroud)


Arm*_*ndo 0

只需要定义moduleNameMapperin jest 配置:

// package.json
"jest": {
  "moduleNameMapper": {
      "^@assets.+\\.(png)$": "<rootDir>/assetsTransformer.js"
  },
}

// assetsTransformers.js
const path = require('path');

module.exports = {
  process(src, filename, config, options) {
    return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';';
  },
};
Run Code Online (Sandbox Code Playgroud)

感谢您的评论:-)