我正在尝试测试使用React CSS模块的组件的生成类
这是一个示例Foo
组件:
import React from 'react';
import CSSModules from 'react-css-modules';
import styles from './Foo.css';
const Foo = ({ className }) => <div styleName={className} />;
Foo.propTypes = {
className: React.PropTypes.string.isRequired,
};
export default CSSModules(Foo, styles, { allowMultiple: true, errorWhenNotFound: false });
测试代码(Foo.spec.jsx
):
import React from 'react';
import { expect } from 'chai';
import { shallow } from 'enzyme';
import Foo from '../../../app/components/Foo';
describe('<Foo/>', () => {
it.only('should return a className prop as class value', () => {
const wrapper = shallow(<Foo className="bar" />);
console.log('DEBUG----->', wrapper.html());
});
});
Foo.css代码:
.bar {
background-color: red;
}
这是测试html输出:
DEBUG-----> <div></div>
如您所见,它会生成一个没有任何类的空div,因此没有断言起作用。
我也想提出一个事实,那就是它仅在测试中失败,该组件在Web应用程序生成的html代码中生成了预期的html类。
任何想法如何解决这个问题?
更新
如法比奥的评论所建议,我试图删除该选项 errorWhenNotFound: false
现在测试给出以下错误信息:
错误:“ bar” CSS模块未定义。
我不明白,因为bar类是在Foo.css
文件中定义的。
我还发现,如果我调试Foo
组件中的样式:
import styles from './Foo.css';
console.log('STYLES', styles);
它返回一个空的输出:
样式{}
尽管在此简化示例中以及在完整的代码中,该组件都在Web应用程序生成的html代码中生成了预期的html类,并且具有良好的相应样式。
正如OP在评论中指出的那样,问题在于Mocha正在使用ignore-styles选项运行。这与errorWhenNotFound: false
选项一起掩盖了实际问题,即模块导出的样式对象实际上为空,而Mocha忽略了该模块。
如果没有启用该选项,则仍然需要指示Mocha导入CSS模块并正确解析它。该/var/www/web/app/components/Icon.css: Leading decorators must be attached to a class
声明错误可能是由于该摩卡试图解释的CSS文件JS,这显然失败的内容的事实。
要正确设置,请在此处查看:https : //gist.github.com/mmrko/288d159a55adf1916f71
这个想法是做这样的事情:
var hook = require('css-modules-require-hook')
var sass = require('node-sass')
hook({
extensions: [ '.scss', '.css' ],
generateScopedName: '[local]___[hash:base64:5]',
preprocessCss: ( data, file ) => sass.renderSync({ file }).css
})
(在您执行其他操作之前)在Mocha条目文件中,告诉您如何处理CSS / SASS文件。
您可以将要点的内容放入例如test / setup.js文件中,然后以这种方式运行Mocha:
mocha --compilers js:babel-register --require ./test/setup.js \"./test/**/*.spec.js\"
这样,您的setup.js初始化代码将在测试之前运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句