2016-06-30 20 views
1

私はReactフレームワークを初めて使用しています。今はReactでコンポーネントをテストする方法を模索しています。この例に従う:https://www.codementor.io/reactjs/tutorial/test-reactjs-components-karma-webpack mochaとkarmaを使用してReactのためのユニットテストフレームワークを設定する。.jsx拡張子を持つ反応コンポーネントのテスト

私のコンポーネントはすべて.jsx拡張子で、.jsではなく、もっと深く掘り下げていることに気付きました。私は、コンポーネントをインポート/使用する前に構築する必要があることを理解しました。

私はこの例を使って試しました:http://www.bebetterdeveloper.com/coding/getting-started-react-mocha.html。しかしこれはカルマをカバーしていません。

karmaを使用してjsxファイルをビルドしてインポートするにはどうすればよいですか?

私はアーティファクトを構築するためのがぶ飲みを使用していますし、私のNodeJS版はここ5.6

+0

カルマを使用する特別な理由はありますか?私はあなたに私の完全なテストのセットアップを与える答えを投稿することができますが、私はモカとチャイを使用し、私はカルマのようなテストランナーの必要はありません。 –

+0

カルマを使用する特別な理由はありません。私はチュートリアルに従っていたようで、カルマやジャスミンのようなもののほとんどの例が明らかです。だからええ。しかし、その後、フォローアップの質問は、カルマ、モカ、グルプを使用することはできないのでしょうか? – chrisrhyno2003

+0

これは間違いなく可能ですが、これまでにやったことはないので、私はあなたに答えを投稿することはできません。しかしカルマやジャスミンを捨てても大丈夫なら、セットアップを投稿することができます。 –

答えて

2

のは、ユニットテストは、モカ、チャイ、およびテストランナーの代わりに使用されjsdomヘルパーを使用して、コンポーネントに反応するための簡単な例ですカルマのように。

あなたは次の依存関係が必要になります。

"dependencies": { 
    "react": "^15.1.0", 
    "react-dom": "^15.1.0" 
}, 
"devDependencies": { 
    "babel-preset-es2015": "^6.9.0", 
    "babel-preset-react": "^6.11.1", 
    "babel-register": "^6.9.0", 
    "chai": "^3.5.0", 
    "jsdom": "^9.3.0", 
    "mocha": "^2.5.3" 
} 

それはモカを指すNPMスクリプト持つことも便利です - npm run testをあなたのテストを実行します:あなたはあなたの依存関係を設定した後

"scripts": { 
    "test": "./node_modules/.bin/mocha" 
}, 

をディレクトリ構造は次のようになります:

. 
├── /src 
│ └── component-to-test.js 
├── /test 
│ ├── /unit 
│ │ └── component-to-test.spec.js 
│ ├── /util 
│ │ └── jsdom.js 
│ └── mocha.opts 
├── .babelrc 
└── package.json 

まず、.babelrcファイルから始めましょう。 JSXをJavaScriptに変換するには、Babelが必要です。 ES6構文を使用したい場合(強くお勧めします)、Babelもそれを手助けします。私はこれらのプリセットをdevDependenciesに含めました。

.babelrc:

{ 
    "presets": ["es2015", "react"] 
} 

次に、我々はjsdomヘルパーを見てみましょう。 Reactコンポーネントをメモリ内のDOMにレンダリングするためにはこれが必要です。通常はカルマのようなテストランナーによって処理されます。

jsdom.js:

(function() { 
    'use strict'; 

    var jsdom = require('jsdom'), 
     baseHTML, 
     window; 

    if (!global.window) { 
     baseHTML = '<!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"><title>Tests</title></head><body></body></html>'; 
     window = jsdom.jsdom(baseHTML).defaultView; 

     global.window = window; 
     global.document = window.document; 
     global.navigator = window.navigator; 
    } 

}()); 

当社モカテストで使用するためにこのjsdomヘルパーを活用するために、我々はいくつかの設定オプションを指定するmocha.optsファイルを設定する必要があります。テストを前処理するようにBabelに指示するコンパイラを追加します。require jsdomヘルパーがReactにコンポーネントをレンダリングするために使用するDOMを持つようにします。

mocha.opts:

--compilers js:babel-register 
--recursive 
--reporter spec 
--ui bdd 
--require ./test/util/jsdom.js 

最後に、我々は、部品を反応させるのテストを開始することができます。一例として、ここではテストできる単純なコンポーネントがあります。

テストコンポーネント。js:

import React from 'react'; 

export default class TestComponent extends React.Component { 
    render() { 
     return (
      <div className="test-component">Here is a test component</div> 
     ); 
    } 
} 

ここに、このコンポーネントのマークアップをテストするテストスイートがあります。

試験component.spec.js:

import TestComponent from '../../src/test-component'; 
import {expect} from 'chai'; 

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import ReactTestUtils from '../../node_modules/react/lib/ReactTestUtils'; 

describe('Test Component',() => { 
    let renderedNode; 

    function renderComponent() { 
     const componentElement = React.createElement(TestComponent), 
      renderedElement = ReactTestUtils.renderIntoDocument(componentElement); 

     renderedNode = ReactDOM.findDOMNode(renderedElement); 
    } 

    beforeEach(() => { 
     renderComponent(); 
    }); 

    it('should exist with the correct markup',() => { 
     expect(renderedNode.tagName).to.equal('DIV'); 
     expect(renderedNode.className).to.equal('test-component'); 
     expect(renderedNode.textContent).to.equal('Here is a test component'); 
    }); 
}); 

この時点で、コマンドnpm run test単一通過試験をもたらすはずです。

それだけです!より高度なテスト手法を探しているなら、jsdomヘルパーの必要性を完全に回避し、テストに浅いレンダリングを使用することができます。このアプローチをとる場合は、Enzymeを強くお勧めします。

ご不明な点がありましたら教えてください。

+0

これは素晴らしいことです。しかし、もう一度、反応コンポーネントファイルの拡張子は.jsではなく.jsxになります。テストには影響しませんか? – chrisrhyno2003

+0

いいえ、どちらの拡張子も使用できます。唯一の違いは、テストの 'import'ステートメントに' .jsx'ファイル拡張子を含める必要があることです。拡張子を省略すると、 '.js'で終わるファイルに対してのみ許可されます。 –

+0

ああ、大丈夫です。私はこれを試してみる。これは素晴らしい。ありがとうございました! – chrisrhyno2003

関連する問題