Mis*_*hko 50 reactjs webpack jestjs
我使用webpack开发一个React组件.这是一个简单的版本:
'use strict';
require('./MyComponent.less');
var React = require('react');
var MyComponent = React.createClass({
render() {
return (
<div className="my-component">
Hello World
</div>
);
}
});
module.exports = MyComponent;
Run Code Online (Sandbox Code Playgroud)
现在,我想使用jest测试这个组件.以下是我的相关内容package.json:
"scripts": {
"test": "jest"
},
"jest": {
"rootDir": ".",
"testDirectoryName": "tests",
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
"unmockedModulePathPatterns": [
"react"
]
}
Run Code Online (Sandbox Code Playgroud)
运行时npm test,我收到以下错误:
SyntaxError:/Users/mishamoroshko/react-component/src/tests/MyComponent.js:/Users/mishamoroshko/react-component/src/MyComponent.js:/Users/mishamoroshko/react-component/src/MyComponent.less:Unexpected令牌ILLEGAL
看起来webpack需要require('./MyComponent.less')在jest运行测试之前进行处理.
我想知道我是否需要使用像jest-webpack这样的东西.如果是,有没有办法指定多个scriptPreprocessors?(注意我已经使用过babel-jest)
Zah*_*hiC 24
我发现忽略所需模块的最干净的解决方案是使用moduleNameMapper配置(适用于最新版本0.9.2)
文档很难遵循.我希望以下内容有所帮助.
将moduleNameMapper键添加到packages.json配置中.项的键应该是所需字符串的正则表达式.'.less'文件示例:
"moduleNameMapper": { "^.*[.](less|LESS)$": "EmptyModule" },
Run Code Online (Sandbox Code Playgroud)
将EmptyModule.js添加到根文件夹:
/**
* @providesModule EmptyModule
*/
module.exports = '';
Run Code Online (Sandbox Code Playgroud)
注释很重要,因为moduleNameMapper使用EmptyModule作为此模块的别名(了解有关 provideModule的更多信息).
现在每个需要与正则表达式匹配的引用将被替换为空字符串.
如果将moduleFileExtensions配置与'js'文件一起使用,请确保还将EmptyModule添加到'unmockedModulePathPatterns'.
这是我最终得到的最佳配置:
"jest": {
"scriptPreprocessor": "<rootDir>/node_modules/babel-jest",
"moduleFileExtensions": ["js", "json","jsx" ],
"moduleNameMapper": {
"^.*[.](jpg|JPG|gif|GIF|png|PNG|less|LESS|css|CSS)$": "EmptyModule"
},
"preprocessorIgnorePatterns": [ "/node_modules/" ],
"unmockedModulePathPatterns": [
"<rootDir>/node_modules/react",
"<rootDir>/node_modules/react-dom",
"<rootDir>/node_modules/react-addons-test-utils",
"<rootDir>/EmptyModule.js"
]
}
Run Code Online (Sandbox Code Playgroud)
Mis*_*hko 19
我最终得到了以下黑客攻击:
// package.json
"jest": {
"scriptPreprocessor": "<rootDir>/jest-script-preprocessor",
...
}
// jest-script-preprocessor.js
var babelJest = require("babel-jest");
module.exports = {
process: function(src, filename) {
return babelJest.process(src, filename)
.replace(/^require.*\.less.*;$/gm, '');
}
};
Run Code Online (Sandbox Code Playgroud)
但是,我仍然想知道这个问题的正确解决方案是什么.
我刚刚发现Jest的moduleNameMapper配置更简单.
// package.json
"jest": {
"moduleNameMapper": {
"^.+\\.scss$": "<rootDir>/scripts/mocks/style-mock.js"
}
}
// style-mock.js
module.exports = {};Run Code Online (Sandbox Code Playgroud)
有关Jest 教程页面的更多详细信息.
| 归档时间: |
|
| 查看次数: |
22579 次 |
| 最近记录: |