这样我们就可以通过 yarn test 或 npm test 执行测试代码。
同样地,你也可以选择全局安装 Jest:
$ yarn global add jest
$ # or npm i -g jest
这样你就可以直接在命令行使用 jest 命令。如果你是本地安装,但是也想在命令行使用 jest,可以通过 node_modules/.bin/webpack 访问它的 bin 版本,如果你的 npm 版本在 5.2.0 以上,你也可以通过 npx jest 访问。 使用 Babel
如果你在代码中使用了新的语法特性,而当前 Node 版本不支持,则需要使用 Babel 进行转义。
$ npm i -D babel-jest babel-core babel-preset-env
注意:如果你使用 babel 7,安装 babel-jest 的同时还需要安装其他依赖:
npm i -D babel-jest 'babel-core@^7.0.0-0' @babel/core
Jest 默认使用 babel-jest(需要安装) 进行代码转义,如果你需要添加额外的预处理器,则需要在 Jest 配置文件中显示的定义 babel-jest 作为 JavaScript 处理器(因为一旦添加了 transform 配置,babel-jest 就不会自动载入了):
"transform": {
"^.+\\.jsx?$": "babel-jest"
},
我们还需在根目录下创建 .babelrc 文件:
{
"presets": [
"env"
]
}
我这里只使用了 babel-preset-env 预设,如果需要其他的转换,见 babel。 基本用法
我们从一个基本的 Math 模块开始。首先创建一个 math.js 文件:
// basic/math.js
const sum = (a, b) => a + b
const mul = (a, b) => a * b
const sub = (a, b) => a - b
const div = (a, b) => a / b
export { sum, mul, sub, div }
Mocks
在测试中,mock 可以让你更方便的去测试依赖于数据库、网络请求、文件等外部系统的函数。
Jest 内置了 mock 机制,提供了多种 mock 方式已应对各种需求。 Mock 函数
函数的 mock 非常简单,调用 jest.fn() 即可获得一个 mock 函数。
Mock 函数有一个特殊的 .mock 属性,保存着函数的调用信息。.mock 属性还会追踪每次调用时的 this。
// mocks/forEach.js
export default (items, callback) => {
for (let index = 0; index < items.length; index++) {
callback(items[index])
}
}
import forEach from './forEach'
it('test forEach function', () => {
const mockCallback = jest.fn(x => 42 + x)
forEach([0, 1], mockCallback)
// The mock function is called twice
expect(mockCallback.mock.calls.length).toBe(2)
// The first argument of the first call to the function was 0
expect(mockCallback.mock.calls[0][0]).toBe(0)
// The first argument of the second call to the function was 1
expect(mockCallback.mock.calls[1][0]).toBe(1)
// The return value of the first call to the function was 42
expect(mockCallback.mock.results[0].value).toBe(42)
})
除了 .mock 之外,Jest 还未我们提供了一些匹配器用来断言函数的执行,它们本身只是检查 .mock 属性的语法糖:
// The mock function was called at least once
expect(mockFunc).toBeCalled();