React 16のテストユニット(Jest+React+Enzyme)
6194 ワード
転載先:
React 16のテストユニット(Jest+React+Enzyme)
インストールenzyme関連
npm install enzyme enzyme-adapter-react-16 --save-dev
npm install jest babel-jest babel-preset-env react-test-renderer --save-dev
npm install enzyme-to-json
パッケージを変更します。json
"test": "jest --notify --watchman=false",
ここでは、なぜ--watchman=falseを加えるのかを強調します.国内ではwatchman接続がタイムアウトになるからです.どうやって知っているのか聞かないでください.102時間説明してもいいです.どうせ国内では私の言うとおりにしてください.そうしないと、あなたは憂鬱になります. jest.config.js jest.setup.js
jest.config.js module.exports = {
setupFiles: ['./jest.setup.js'],
snapshotSerializers: ['enzyme-to-json/serializer'],
};
jest.setup.js import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({
adapter: new Adapter(),
});
どうしてjestがあるの?setup.js、公式サイトのはテストファイルの中で実は直接プラスすることができますimport { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({
adapter: new Adapter(),
});
このコードの、しかし繰り返し操作しないため、ある人はこのコードを出して、1つの単独のファイルの中に置いて、これもjestプロファイルの支持で、この点はとても良いです
テストケース
src/lib/sum.js function sum(a, b) {
return a + b;
}
module.exports = sum;
src/__tests__/sum.test.js const sum = require('../lib/sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
jestを実行してテストする
$ npm test
> [email protected] test /Users/durban/nodejs/webpack-react-demo
> jest --notify --watchman=false
PASS src/__tests__/sum.test.js
✓ adds 1 + 2 to equal 3 (4ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 2.348s
Ran all test suites.
なぜテストケースをディレクトリに配置するのかtests__
デフォルトのjestはtestMatchで一致するファイルをスキャンし、testPathIgnorePatternsで一致するファイルを無視します.具体的には、プロファイルで変更できます.testMatch: **/__tests__/**/*.js?(x),**/?(*.)+(spec|test).js?(x)
testPathIgnorePatterns: /node_modules/
Reactコンポーネントのテスト例
src/components/CheckboxWithLabelComponent.jsx import React from 'react';
import PropTypes from 'prop-types';
class CheckboxWithLabelComponent extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
isChecked: false,
};
this.onChange = this.onChange.bind(this);
}
onChange() {
this.setState({
isChecked: !this.state.isChecked,
});
}
render() {
return (
);
}
}
CheckboxWithLabelComponent.propTypes = {
labelOn: PropTypes.string.isRequired,
labelOff: PropTypes.string.isRequired,
};
export default CheckboxWithLabelComponent;
src/__tests__/CheckboxWithLabelComponent.test.jsx import React from 'react';
import { shallow } from 'enzyme';
import CheckboxWithLabelComponent from '../components/CheckboxWithLabelComponent';
test('CheckboxWithLabelComponent changes the text after click', () => {
// Render a checkbox with label in the document
const checkbox = shallow();
expect(checkbox.text()).toEqual('Off');
checkbox.find('input').simulate('change');
expect(checkbox.text()).toEqual('On');
});
jestを実行してテストする
$ npm test
> [email protected] test /Users/durban/nodejs/webpack-react-demo
> jest --notify --watchman=false
PASS src/__tests__/sum.test.js
PASS src/__tests__/CheckboxWithLabelComponent.test.jsx
Test Suites: 2 passed, 2 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 2.188s
Ran all test suites.
いいですね.先端もこんなにすごいことができるのか.
.babelrcも修正を忘れないで
presetsにenvを追加"presets": [
"es2015",
"react",
"stage-0",
"env"
]
プロジェクトアドレスhttps://github.com/durban89/webpack4-react16-reactrouter-demo.git
tag:v_1.0.14
転載先:
React 16のテストユニット(Jest+React+Enzyme)
npm install enzyme enzyme-adapter-react-16 --save-dev
npm install jest babel-jest babel-preset-env react-test-renderer --save-dev
npm install enzyme-to-json
"test": "jest --notify --watchman=false",
jest.config.js jest.setup.js
module.exports = {
setupFiles: ['./jest.setup.js'],
snapshotSerializers: ['enzyme-to-json/serializer'],
};
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({
adapter: new Adapter(),
});
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({
adapter: new Adapter(),
});
function sum(a, b) {
return a + b;
}
module.exports = sum;
const sum = require('../lib/sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
$ npm test
> [email protected] test /Users/durban/nodejs/webpack-react-demo
> jest --notify --watchman=false
PASS src/__tests__/sum.test.js
✓ adds 1 + 2 to equal 3 (4ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 2.348s
Ran all test suites.
testMatch: **/__tests__/**/*.js?(x),**/?(*.)+(spec|test).js?(x)
testPathIgnorePatterns: /node_modules/
import React from 'react';
import PropTypes from 'prop-types';
class CheckboxWithLabelComponent extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
isChecked: false,
};
this.onChange = this.onChange.bind(this);
}
onChange() {
this.setState({
isChecked: !this.state.isChecked,
});
}
render() {
return (
);
}
}
CheckboxWithLabelComponent.propTypes = {
labelOn: PropTypes.string.isRequired,
labelOff: PropTypes.string.isRequired,
};
export default CheckboxWithLabelComponent;
import React from 'react';
import { shallow } from 'enzyme';
import CheckboxWithLabelComponent from '../components/CheckboxWithLabelComponent';
test('CheckboxWithLabelComponent changes the text after click', () => {
// Render a checkbox with label in the document
const checkbox = shallow();
expect(checkbox.text()).toEqual('Off');
checkbox.find('input').simulate('change');
expect(checkbox.text()).toEqual('On');
});
$ npm test
> [email protected] test /Users/durban/nodejs/webpack-react-demo
> jest --notify --watchman=false
PASS src/__tests__/sum.test.js
PASS src/__tests__/CheckboxWithLabelComponent.test.jsx
Test Suites: 2 passed, 2 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 2.188s
Ran all test suites.
"presets": [
"es2015",
"react",
"stage-0",
"env"
]
https://github.com/durban89/webpack4-react16-reactrouter-demo.git
tag:v_1.0.14