使用 npm 或 Yarn 安装 Jest:
npm install --save-dev jest
# or
yarn add --dev jest
基础测试
创建一个 sum.js
文件:
function sum(a, b) {
return a + b;
}
module.exports = sum;
创建一个 sum.test.js
文件:
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
在 package.json
中添加测试脚本:
{
"scripts": {
"test": "jest"
}
}
运行测试:
npm test
快照测试
创建一个 React 组件 Link.js
:
import React from 'react';
function Link({ page, children }) {
return <a href={page}>{children}</a>;
}
export default Link;
创建一个测试文件 Link.test.js
:
import React from 'react';
import renderer from 'react-test-renderer';
import Link from './Link';
test('renders correctly', () => {
const tree = renderer.create(<Link page="https://www.example.com">Example</Link>).toJSON();
expect(tree).toMatchSnapshot();
});
Mock 功能
创建一个文件 fetchData.js
:
function fetchData(callback) {
setTimeout(() => {
callback('peanut butter');
}, 1000);
}
module.exports = fetchData;
创建一个测试文件 fetchData.test.js
:
const fetchData = require('./fetchData');
test('the data is peanut butter', done => {
function callback(data) {
expect(data).toBe('peanut butter');
done();
}
fetchData(callback);
});
test(name, fn, timeout):定义一个测试用例。
test('description', () => {
// test code
});
expect(value):断言一个值,与各种匹配器结合使用。
expect(sum(1, 2)).toBe(3);
describe(name, fn):定义一个测试套件,将相关的测试用例分组。
describe('Math functions', () => {
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
});
beforeEach(fn, timeout):在每个测试用例运行之前执行的函数。
beforeEach(() => {
// setup code
});
afterEach(fn, timeout):在每个测试用例运行之后执行的函数。
afterEach(() => {
// teardown code
});
jest.fn():创建一个 mock 函数。
const mockFn = jest.fn();
jest.mock(moduleName, factory, options):自动 mock 模块。
jest.mock('moduleName');
并行测试
Jest 默认并行运行测试,利用多核 CPU 提高测试速度。可以通过设置 maxWorkers
参数来控制并行测试的数量。
jest --maxWorkers=4
自定义匹配器
Jest 允许创建自定义匹配器以增强测试断言功能:
expect.extend({
toBeDivisibleBy(received, argument) {
const pass = received % argument === 0;
if (pass) {
return {
message: () => `expected ${received} not to be divisible by ${argument}`,
pass: true,
};
} else {
return {
message: () => `expected ${received} to be divisible by ${argument}`,
pass: false,
};
}
},
});
test('10 is divisible by 2', () => {
expect(10).toBeDivisibleBy(2);
});