2017-08-30 88 views
0

我正在开发与react-native和typescript的应用程序并使用Jest进行测试,但是当我使用作用域包(@assets)时,我遇到问题,jest无法找到路径并给出错误。与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 

所以,当我运行的笑话:

npm run jest build/

它无法找到 '@资产/ IMG/foo.png',并抛出错误:

Cannot find module '@assets/img/logo.png' from 'Foo.js'

如何在Jest中使用范围包?

玩笑版本:20.0.4

感谢

+0

erm。如果你没有在'node_modules'和'npm install'ed /'链接''中获得'package.json',它就不会在意子节点。你仍然可以通过webpack别名得到它的工作,请参阅https://webpack.js.org/configuration/resolve/ –

+0

@DimitarChristoff,感谢兄弟,我找到了'moduleNameMapper',我可以放在jest config中。 – Armando

回答

0

仅需定义开玩笑配置的moduleNameMapper

// 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)) + ';'; 
    }, 
}; 

感谢this comment :-)

+0

当然 - 我做了这个存根真正的所有静态资产:) https://github.com/DimitarChristoff/jest-static-stubs –

0

对于那些来到这里这是使用私人包下的组织范围,这里是我如何解决这个问题:

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

这假定您所有的作用域包都具有与其导出模块类似的路径。如果他们不这样做,您可以单独指定它们:

"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" 
    } 
}