其實參考官方文檔很容易就完成搭建了,所以本文也是對官網進行一個測試搭建過程的簡單演練。
https://jestjs.io/
https://enzymejs.github.io/en...javascript
固然爲了方便開發,安裝對應的types頗有必要css
enzyme-adapter-react官網上目前的版本列表,其它版本請移步官網查詢
表格1-1java
enzyme適配器版本 | React版本 |
---|---|
enzyme-adapter-react-16 | ^16.4.0-0 |
enzyme-adapter-react-16.3 | ~16.3.0-0 |
enzyme-adapter-react-16.2 | ~16.2 |
enzyme-adapter-react-16.1 | ~16.0.0-0~16.1 |
enzyme-adapter-react-15 | ^15.5.0 |
enzyme-adapter-react-15.4 | 15.0.0-0 - 15.4.x |
enzyme-adapter-react-14 | ^0.14.0 |
enzyme-adapter-react-13 | ^0.13.0 |
.babelrcnode
{ "presets": [ [ "@babel/preset-env", { "targets": { "node": "current" } } ], "@babel/preset-typescript", "@babel/preset-react" ] }
jest.config.jsreact
module.exports = { testEnvironment: 'node', roots: ['<rootDir>'], // 測試文件是src目錄下*.test.jsx或者*.test.tsx的文件 testRegex: 'src/(.+)\\.test\\.(jsx?|tsx?)$', // 自定義轉換方式,轉換jsx、tsx文件 transform: { '^.+\\.(j|t)sx?$': '<rootDir>/node_modules/babel-jest', }, // 模塊資源映射,例如alias的配置 moduleNameMapper: { // 用於css、js、圖片等文件的mock '\\.(css|less|scss)$': 'identity-obj-proxy', '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': 'identity-obj-proxy', // alias '^@mock/(.*)$': '<rootDir>/mock/$1', }, testPathIgnorePatterns: ['\\node_modules\\'], moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], // 覆蓋率從哪些文件收集,設置後即便0覆蓋率的文件也會計算進來 collectCoverageFrom: ['src/**/*.{ts,tsx,js,jsx}', '!**/node_modules/**', '!**/dist/**'], // 測試報告輸出地址 coverageDirectory: '<rootDir>/coverage', // 在每一個測試文件執行以前,運行一些代碼以配置或設置測試框架。 setupFilesAfterEnv: ['./src/test/setupTests.js'], };
setupTests.jsgit
import { configure } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import jsdom from 'jsdom'; // 設置react和enzyme的適配器 configure({ adapter: new Adapter() }); // 配置給render掛載在global用到的dom對象 const { JSDOM } = jsdom; const { window } = new JSDOM(''); const { document } = new JSDOM(``).window; global.document = document; global.window = window;
package.jsongithub
"scripts": { ... "test": "jest" "test:coverage": "jest --coverage" }
npm run test
便可運行全部的單元測試npm run test:coverage
就能夠運行生成覆蓋率報告的單元測試web
測試一個checkbox組件typescript
import { mount, ReactWrapper } from 'enzyme'; import CheckBox, { Props } from './index'; import React from 'react'; describe('CheckBox', () => { ... it('should emit onChange corretly', () => { const props: Props = { checked: false, option: { label: 'test1', value: '111' }, onChange: jest.fn(), }; const wrapper = mount(<CheckBox {...props}></CheckBox>); wrapper.find('.checkbox-item').simulate('click'); expect(onChange).toHaveBeenCalledWith({ checked: true, option }); }); });
在開發過程當中,咱們可能只想運行一個測試case,有2個方案能夠解決npm
修改jest.config.js(不要提交到線上)
module.exports = { ... // 修改成指定文件 testRegex: 'src/(.+)\\checkbox\\.test\\.(jsx?|tsx?)$',