2016-10-04 4 views
6

私はここで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クラスを生成します。

これを修正する方法はありますか?

UPDATE

私はオプションerrorWhenNotFound: false

を削除しようとしたファビオによってコメントで示唆したように今の試験は、次のエラーメッセージが得られます。

Error: "bar" CSS module is undefined.

IドンバークラスはFoo.cssファイルで定義されているため、理解できません。

STYLES {}

この単純な例では、フルで両方ものの:

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

それは空の出力を返します。

はまた、私はFooコンポーネントのスタイルをデバッグする場合は、そのIを見つけました本格的なコードでは、コンポーネントは、Webアプリケーションで生成されたhtmlクラスを生成し、対応するスタイルが正常に動作するhtmlコードを生成します。

+1

あなたはWebPACKのを使用している場合は、インポートしたCSSファイルを無視し、テスト固有のconfig /ローダーを持っていますか? CSSModulesがそのクラス名を見つけられず、 '' 'errorWhenNotFound:false'''(これを削除して問題のデバッグを助けることもできます)によってエラーが無視されることがあります。 –

+1

これで、出力にクラスが表示されない理由は少なくともわかりました。私はまだあなたがいくつかのテスト関連の設定やCSSファイルの内容を無視するコードを持っていると思う、このようなもの:https://www.npmjs.com/package/ignore-stylesこれはかなりテストで使用するのが一般的です。あなたは、あなたがテストに使う完全なwebpack設定を投稿できますか?あなたはテストランナーとしてモカを使用していますか?このhttps://github.com/airbnb/enzyme/issues/202に関連する何かをしようとしていますか? –

+0

私はあなたが大当たりを打つと思う! Mochaは 'ignore-styles'オプションで実行されていましたが、これが修正されたので、次のエラーメッセージが生成されています:' SyntaxError:/var/www/web/app/components/Icon.css:リーディングデコレータを添付する必要がありますクラス宣言に ' しかし、少なくとも今は別の問題です。 – rfc1484

答えて

10

コメントに記載されている通り、問題は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 
}) 

を(あなたが何かを行う前に)、 css/sassファイルの処理方法を教えてください。

あなたは例えば、テスト/ setup.jsファイル内にその主旨の内容を入れて、その後、このようにモカを実行できます。

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

このように、あなたのsetup.js初期化コードが実行されますテストの前に。

+0

モカエントリとは何ですか? –

+0

@angrykiwi実際のテストを実行する前にmochaで必要なファイルを意味します(したがって "エントリポイント"のように "エントリ")。私の記事の最後のコマンドを見て、私は2つのファイルパスを--requireフラグに渡します。最初は "entry"と呼ばれ、2番目はすべての実際のテストファイルを含むglobです。 setup.jsのコードを何よりも先に実行して、テスト中のコードで必要なsassファイルをどのようにコンパイルするかをmochaに指示することができます。 –

+0

完全に統合された反応&& cssモジュールとモカによるテストの例がありますか? –

0

ありがとうございます! あなたはSASSに関係していない場合にも、単にこれを行うことができます...

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

hook({ 
    generateScopedName: '[local]___[hash:base64:5]', 
}) 
関連する問題