Jest
基于Jest 的单元测试
环境搭建
依照惯例,我们先使用
npm install --save-dev jest
为了方便在
"scripts": {
"test": "jest"
},
此外,为了方便对我们使用
$ npm install --save-dev babel-jest babel-preset-es2015 babel-preset-react
依赖安装完毕之后,我们就像配置其他的基于
{
"presets": ["es2015", "react"]
}
环境搭建完毕之后,我们就可以进行简单的测试用例编写了,譬如我们的代码库
export default function sum(a, b) {
return a + b;
}
该函数对应的测试用例放置在__test__
目录下的文件。我们的测试用例编写如下:
import sum from "../../src/util/sum.js";
test("adds 1 + 2 to equal 3", () => {
expect(sum(1, 2)).toBe(3);
});
测试代码编写完毕之后,我们使用 jest test/util/sum.test.js
命令来运行测试用例,可以在命令行中得到如下的反馈:
PASStest/util/sum.test.js
✓ adds 1 + 2 to equal 3 (2ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time:0.565s, estimated 1s
Ran all test suites matching "test/util/sum.test.js".
到这里我们已经搭建了能够支撑
// package.json
{
"jest": {
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(scss|css|less)$": "<rootDir>/__mocks__/styleMock.js"
}
}
}
其对应的
// __mocks__/styleMock.js
module.exports = {};
// __mocks__/fileMock.js
module.exports = "test-file-stub";
除了对于静态资源文件的配置之外,我们还可以使用类似于modulesDirectories
、extensions
等配置项来自定义
// package.json
{
"jest": {
"modulePaths": ["/shared/vendor/modules"],
"moduleFileExtensions": ["js", "jsx"],
"moduleDirectories": ["node_modules", "bower_components", "shared"],
"moduleNameMapper": {
"\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js",
"\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
}
}
}
Webpack
最后,我们还需要考虑如何在
// .babelrc
{
"presets": [["es2015", { "modules": false }]],
"env": {
"test": {
"plugins": ["transform-es2015-modules-commonjs"]
}
}
}
而如果在组件开发中我们使用了动态模块导入,即 import('some-file.js').then(module => …)
这样的语法,我们还需要添加
// .babelrc
{
"presets": [["es2015", { "modules": false }]],
"plugins": ["syntax-dynamic-import"],
"env": {
"test": {
"plugins": ["dynamic-import-node"]
}
}
}
TypeScript
在
$ yarn add -D typescript jest ts-jest @types/jest
我们可以通过自定义
// package.json
{
"jest": {
"moduleFileExtensions": ["ts", "tsx", "js"],
"transform": {
"^.+\\.(ts|tsx)$": "<rootDir>/preprocessor.js"
},
"testMatch": ["**/__tests__/*.(ts|tsx|js)"]
}
}
const tsc = require("typescript");
const tsConfig = require("./tsconfig.json");
module.exports = {
process(src, path) {
if (path.endsWith(".ts") || path.endsWith(".tsx")) {
return tsc.transpile(src, tsConfig.compilerOptions, path, []);
}
return src;
}
};
或者直接使用
module.exports = {
transform: {
"^.+\\.tsx?$": "ts-jest"
},
testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"]
};