Jest+Enzymeに基づくReactユニットテスト
11187 ワード
前言
Reactユニットのテストを学びたいなら、この文章から始めましょう.Starプロジェクト、cloneは地元に行きます.教程によって一回歩きます.どんな問題がありますか?issue討論を歓迎します.
プロジェクトGitHubアドレス:react-test-demo
記事の主な内容は以下の通りです.*JestとEnzymeの基本的な紹介*テスト環境構築*テストシナリオ作成*UIコンポーネントテスト*Reducerテスト*実行とデバッグ*参考資料
Jest、Enzyme紹介
JestはFacebookのオープンソースであり、
AirbnbオープンソースのReactテストクラスのEnzymeは簡潔で強力なAPIを提供し、jQueryスタイルでDOM処理を行い、開発体験はとても友好的です.オープンソースコミュニティだけでなく、Reactオフィシャルのオススメもあります.
テスト環境の構築
Reactアプリケーションを開発した上で(デフォルトではWebpack+Babelでパッケージ化してアプリケーションを構築する)、
上の3つはよく使われている構成で、より多くのJest構成は公式文書を参照してください.
テストスクリプトの作成
UIコンポーネントテスト
環境の構築が終わったら、テストシナリオを書き始めることができます.始める前に、Todoアプリケーションの構成部分を分析します.
応用主体構造は以下の通りである.
上記の分析を経て、私たちはユニットテストスクリプトの作成を開始することができます.
ステップ1:関連libの導入
一般的には、
第二ステップ:アナログProps、レンダリングコンポーネント作成Wrapper
このステップは、
ステップ4:Test Caseを作成する
ここのCaseは私達の前の分析に基づいてテストが必要な点を編纂します.
Case 1:コンポーネントが正常にレンダリングされているかをテストします.
Case 2:内容を入力し、リターンキーを押して、コンポーネントがpropsを呼び出す方法をテストします.
上の二つのTest Caseの分析を経て、次のCase 3とCase 4の考え方も同じです.具体的な書き方はコードに見られます.test/component/AddTodoView.spec.js、ここでは一つ一つ説明しません.
Reducerテスト
Reducerは純粋な関数なので、Reducerのテストは非常に簡単です.Redux公式文書もテストの例を提供しています.コードは以下の通りです.
スクリプトを実行する過程では、
また、プロジェクト中に
資料 just+enzymeを使ってreactプロジェクトテストを行います. フロントエンド自動化試験 について話してください. Enzyme API Jest
Reactユニットのテストを学びたいなら、この文章から始めましょう.Starプロジェクト、cloneは地元に行きます.教程によって一回歩きます.どんな問題がありますか?issue討論を歓迎します.
プロジェクトGitHubアドレス:react-test-demo
記事の主な内容は以下の通りです.*JestとEnzymeの基本的な紹介*テスト環境構築*テストシナリオ作成*UIコンポーネントテスト*Reducerテスト*実行とデバッグ*参考資料
Jest、Enzyme紹介
JestはFacebookのオープンソースであり、
Jasmine
フレームに基づくJavaScriptユニットテストツールです.内蔵したテスト環境DOM APIのサポート、断言ライブラリ、Mockライブラリなどを提供し、Spapplet Testing、Instant Feedbackなどの特性も含まれています.AirbnbオープンソースのReactテストクラスのEnzymeは簡潔で強力なAPIを提供し、jQueryスタイルでDOM処理を行い、開発体験はとても友好的です.オープンソースコミュニティだけでなく、Reactオフィシャルのオススメもあります.
テスト環境の構築
Reactアプリケーションを開発した上で(デフォルトではWebpack+Babelでパッケージ化してアプリケーションを構築する)、
Jest
Enzyme
と対応するbabel-jest
をインストールする必要があります.npm install jest enzyme babel-jest --save-dev
npm依存パッケージをダウンロードした後、package.json
に属性を追加する必要があります.Jestを設定します. "jest": {
"moduleFileExtensions": [
"js",
"jsx"
],
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/__mocks__/fileMock.js" ,
".*\\.(css|less|scss)$": "/__mocks__/styleMock.js"
},
"transform": {
"^.+\\.js$": "babel-jest"
}
},
test scripts
を追加しました."scripts": {
"dev": "NODE_ENV=development webpack-dev-server --inline --progress --colors --port 3000 --host 0.0.0.0 ",
"test": "jest"
}
ここで、*moduleFileExtensions
:ローディングをサポートするファイル名を表し、Webpackのresolve.extensions
と同様に*moduleNameMapper
:Mockを必要とするリソース名を表す.Mock静的リソース(例えば、less、scssなど)が必要であれば、Mockを構成する経路/__mocks__/yourMock.js
*transform
をES 6/ES 7文法のコンパイルに用いる必要があり、babel-jest
に協力して使用する必要がある.上の3つはよく使われている構成で、より多くのJest構成は公式文書を参照してください.
テストスクリプトの作成
UIコンポーネントテスト
環境の構築が終わったら、テストシナリオを書き始めることができます.始める前に、Todoアプリケーションの構成部分を分析します.
応用主体構造は以下の通りである.
class App extends Component {
render() {
const { params } = this.props;
return (
<section className="todoapp">
<div className="main">
<AddTodo />
<VisibleTodoList filter={params.filter || 'all'} />
div>
<Footer />
section>
)
}
}
アプリケーション全体は、*最外層のsrc/component/App.js
*中間のInput入力ボックス
*下のTODOリスト
*の3つのコンポーネントに分けることができることが分かった.
はUIコンポーネントであり、
および
はスマートコンポーネントであり、対応するUIコンポーネント
および
を見つける必要がある.
は
入力ボックスです.文字入力を受けて、リターンキーを押して、Todoを作成します.コードは以下の通りです.import React, { Component, PropTypes } from 'react'
class AddTodoView extends Component {
render() {
return (
<header className="header">
<h1>todosh1>
<input
className="new-todo"
type="text"
onKeyUp={e => this.handleClick(e)}
placeholder="input todo item"
ref='input' />
header>
)
}
handleClick(e) {
if (e.keyCode === 13) {
const node = this.refs.input;
const text = node.value.trim();
text && this.props.onAddClick(text);
node.value = '';
}
}
}
このコンポーネントの機能を理解した後、まず、どのような点をテストする必要があるかを明確にする必要があります.*コンポーネントは正常にレンダリングされていますか?Input
によって送達されるsrc/component/AddTodoView.js
方法は起動されないはずです.上記の分析を経て、私たちはユニットテストスクリプトの作成を開始することができます.
ステップ1:関連libの導入
import React from 'react'
import App from '../../src/component/App'
import { shallow } from 'enzyme'
`shallow` , `Enzyme` API , ** **。 , , 。 、 。
props
はまた、他の2つのAPI:*onAddClick(text)
:Full Renderingを提供しており、DOM APIにインタラクティブコンポーネントが存在するか、またはコンポーネントの完全な宣言周期*props
が必要であり、Reactコンポーネントを静的なHTMLにレンダリングし、生成されたHTML構造を分析するのに非常に適している.onAddClick(text)
によって返されたEnzyme
は、他の2つのAPIと同様である.違いは、mount
が、第三者HTML解析器およびrender
を使用していることである.一般的には、
render
は十分に使われていますが、場合によってはwrapper
を使用します.第二ステップ:アナログProps、レンダリングコンポーネント作成Wrapper
このステップは、
render
関数を作成して実装できます.const setup = () => {
// props
const props = {
// Jest mock
onAddClick: jest.fn()
}
// enzyme shallow( )
const wrapper = shallow(<AddTodoView {...props} />)
return {
props,
wrapper
}
}
Cheerio
に関数が含まれている場合は、Jestが提供するmockFunctionを使用する必要があります.ステップ4:Test Caseを作成する
ここのCaseは私達の前の分析に基づいてテストが必要な点を編纂します.
Case 1:コンポーネントが正常にレンダリングされているかをテストします.
describe('AddTodoView', () => {
const { wrapper, props } = setup();
// case1
// Input,
it('AddTodoView Component should be render', () => {
//.find(selector) Enzyme shallow Rendering ,
// Enzyme http://airbnb.io/enzyme/docs/api/shallow.html
expect(wrapper.find('input').exists());
})
})
最初のテストケースを書き終わったら、テストの効果を見てみます.Terminalにshallow
を入力すると、効果は以下の通りです.Case 2:内容を入力し、リターンキーを押して、コンポーネントがpropsを呼び出す方法をテストします.
it('When the Enter key was pressed, onAddClick() shoule be called', () => {
// mock input Enter
const mockEvent = {
keyCode: 13, // enter
target: {
value: 'Test'
}
}
// Enzyme simulate api DOM
wrapper.find('input').simulate('keyup',mockEvent)
// props.onAddClick
expect(props.onAddClick).toBeCalled()
})
上記のコードは第1のcaseと2点多くなりました.*DOMイベントをシミュレートするためのmount
*setup
によって提供されたProps
を使用して、イベントをシミュレートするためのnpm run test
を追加しました.ここでのmockEvent
は、自動的にReactコンポーネントのEnzyme
に変換して呼び出します..simulate(’keyup‘, mockEvent)
を運転してテストの効果を見ます.上の二つのTest Caseの分析を経て、次のCase 3とCase 4の考え方も同じです.具体的な書き方はコードに見られます.test/component/AddTodoView.spec.js、ここでは一つ一つ説明しません.
Reducerテスト
Reducerは純粋な関数なので、Reducerのテストは非常に簡単です.Redux公式文書もテストの例を提供しています.コードは以下の通りです.
import * as actions from '../../src/actions/index'
import * as types from '../../src/constants/actionTypes'
describe('actions', () => {
it('should create an action to add a todo', () => {
const text = 'Finish docs'
const expectedAction = {
type: types.ADD_TODO,
text
}
expect(actions.addTodo(text)).toEqual(expectedAction)
})
})
デバッグとテストのカバー率報告スクリプトを実行する過程では、
keyup
のエラーメッセージが友好的であり、エラー情報を通じて問題点が一般的に見つけられます.onKeyUp
はまた、npm run test
というパラメータを追加するだけで生成可能であり、テストカバレッジ報告を生成するコマンドを提供する.端末にだけ表示されません.また、プロジェクト中に
Jest
フォルダを生成するので、とても便利です.資料