使用Mocha和Enzyme测试使用React CSS模块的React组件

时间:2016-10-04 12:25:36

标签: unit-testing reactjs mocha enzyme react-css-modules

我试图测试使用React CSS modules

的组件生成的类

以下是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类。

知道如何解决这个问题吗?

更新

正如fabio的评论所示,我试图删除选项errorWhenNotFound: false

现在测试给出以下错误消息:

  

错误:&#34; bar&#34; CSS模块未定义。

我不明白,因为bar类已在Foo.css文件中定义。

我还发现,如果我在Foo组件中调试样式:

import styles from './Foo.css';
console.log('STYLES', styles);

返回空输出:

  

STYLES {}

虽然在这个简化的例子和完整的代码中,组件在Web应用程序生成的html代码中生成了预期的html类,并且相应的样式工作正常。

2 个答案:

答案 0 :(得分:10)

正如OP在评论中所述,问题是Mocha正在使用ignore-styles选项运行。这与errorWhenNotFound: false选项一起掩盖了实际问题,即模块导出的样式对象实际上是空的,模块被Mocha忽略。

如果没有该选项,您仍需要指示Mocha导入CSS模块并正确解析它。 /var/www/web/app/components/Icon.css: Leading decorators must be attached to a class声明错误可能是由于Mocha试图将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文件。

例如,您可以将该gist的内容放在test / setup.js文件中,然后以这种方式运行Mocha:

mocha --compilers js:babel-register --require ./test/setup.js \"./test/**/*.spec.js\"

通过这种方式,您的setup.js初始化代码将在测试之前运行。

答案 1 :(得分:0)

谢谢你的回答! 如果你不关心SASS,你也可以这样做......

import hook from 'css-modules-require-hook'

hook({
  generateScopedName: '[local]___[hash:base64:5]',
})