目录
这里默认是用的react16
yarn add enzyme enzyme-adapter-react-16 jest babel-jest babel-preset-env react-test-renderer enzyme-to-json --dev
修改package.json script:
"test": "jest --config=jest.config.js --notify --watchman=false --detectOpenHandles",
分别添加jest.config.js和jest.setup.js:
这个地方我选择添加在根目录:
jest.config.js:
const path = require('path');
module.exports = {
rootDir: path.resolve(__dirname),
setupFiles: ['./jest.setup.js'],
snapshotSerializers: ['enzyme-to-json/serializer'],
testMatch: ['**/__tests__/**/*.js?(x)', '**/?(*.)+(spec|test).js?(x)'],
testPathIgnorePatterns: ['/node_modules/'],
transform: {
'^.+\\.(js|jsx|mjs)$': '<rootDir>/node_modules/babel-jest',
},
};
jest.setup.js:
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({
adapter: new Adapter(),
});
这个地方需要注意的是, 如果是放置在根目录的话, 其实是不需要再启动项加 --config=jest.config.js
配置的
更多的配置项和说明可以看这里:
const path = require('path');
module.exports = {
rootDir: path.resolve(__dirname, '../'),
collectCoverage: true, // 是否收集测试时的覆盖率信息
collectCoverageFrom: ['<rootDir>/src/**/*.{js,jsx,mjs}'], // 哪些文件需要收集覆盖率信息
coverageDirectory: '<rootDir>/test/coverage', // 输出覆盖信息文件的目录
coveragePathIgnorePatterns: ['/node_modules/', '<rootDir>/src/index.jsx'], // 统计覆盖信息时需要忽略的文件
moduleNameMapper: { // 主要用于与webpack的resolve.alias匹配,注意正则写法
'^src(.*)$': '<rootDir>/src$1',
'^util(.*)$': '<rootDir>/src/util$1',
'^assets(.*)$': '<rootDir>/src/assets$1',
'^components(.*)$': '<rootDir>/src/components$1',
},
setupFiles: ['<rootDir>/test/setup.js'], // 运行测试前可运行的脚本,比如注册enzyme的兼容
testMatch: [ // 匹配的测试文件
'<rootDir>/test/**/?(*.)(spec|test).{js,jsx,mjs}',
'<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}',
],
testURL: 'https://test.com?empty=&num=0&str=str&cstr=中文&encode=%e4%b8%ad%e6%96%87', // 运行环境下的url,默认about:blank
transform: {
'^.+\\.(js|jsx|mjs)$': '<rootDir>/node_modules/babel-jest',
'^.+\\.(css|less)$': '<rootDir>/test/cssTransform.js',
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/test/fileTransform.js',
},
transformIgnorePatterns: [ // 转换时需要忽略的文件
'[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$',
],
};
需要注意的地方是我们自己项目里面的babel版本问题, 如果是最新的babel版本,那么直接就可以安装babel-jest 就可以了, 但是因为我的项目babel 版本比较低, 所以我在安装babel-jest 的时候降低版本到了 version@22 版本。
src/lib/sum.js:
const sum = (a, b) => {
return a + b
};
export default sum;
src/tests/sum.test.js:
import sum from '../lib/sum';
describe('main', () => {
it('adds 1 + 2 to equal 3', function () {
expect(sum(1, 2)).toBe(3)
});
})
然后执行: yarn test / npm run test
, 执行结果如下
$ jest --config=jest.config.js --notify --watchman=false --detectOpenHandles
PASS src/__tests__/sum.test.js
main
✓ adds 1 + 2 to equal 3 (4ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.195s
Ran all test suites.
比如我们先创建一个这样的常见的react组件:
Test/index.js:
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
class Test extends PureComponent {
static propTypes = {
labelOn: PropTypes.string.isRequired,
labelOff: PropTypes.string.isRequired,
};
constructor(props) {
super(props);
this.state = {
isChecked: false,
}
}
onChange = () => {
this.setState({
isChecked: !this.state.isChecked,
})
};
render() {
const {isChecked} = this.state;
return (
<label htmlFor="label">
<input
type="checkbox"
checked={this.state.isChecked}
onChange={this.onChange}
/>
{isChecked ? this.props.labelOn : this.props.labelOff}
</label>
);
}
}
export default Test;
然后定义这样的测试文件:
Test/test/index.test.js:
import React from 'react';
import {mount} from 'enzyme';
import Test from '../index';
describe('Test', () => {
const checkbox = mount(<Test labelOff="off" labelOn="on"/>);
it('default test eq off', function () {
expect(checkbox.text()).toEqual('off');
});
it('change and eq on', function () {
checkbox.find('input').simulate('change');
expect(checkbox.text()).toEqual('on');
});
});
然后运行命令行:yarn test
得到如下测试报告:
$ jest --config=jest.config.js --notify --watchman=false --detectOpenHandles
PASS src/pages/Test/__test__/index.test.js
PASS src/__tests__/sum.test.js
Test Suites: 2 passed, 2 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 1.896s
Ran all test suites.
如果希望得到测试报告文件和测试报告覆盖率, 这个时候, 就可以直接在jest.config.js 文件里面做配置就可以了。 在上面的配置文件中添加如下的配置
collectCoverage: true, // 指出是否收集测试时的覆盖率信息。
coverageReporters: [ // 生成什么样的报告文件
"json",
"lcov",
"text",
"clover"
],
coverageDirectory: "<rootDir>/coverage-client", // 报告输出地址
coverageThreshold: { // 报告阈值
global: {
branches: 80,
functions: 60,
lines: 80,
statements: 80
}
}