Jest 是什么 如何使用

Jest 是一个流行的 JavaScript 测试框架,由 Facebook 开发并维护。它支持各种类型的测试,包括单元测试、集成测试和快照测试。Jest 提供了一整套测试工具,包括断言库、模拟函数、代码覆盖率报告等。

以下是一个使用 Jest 进行单元测试的基本示例:

// add.js
function add(a, b) {
  return a + b;
}

module.exports = add;
// add.test.js
const add = require('./add');

test('adds 1 + 2 to equal 3', () => {
  expect(add(1, 2)).toBe(3);
});

在这个例子中,我们首先定义了一个 add 函数,然后在 add.test.js 文件中编写了一个测试。测试使用 test 函数定义,expect 函数用于断言 add(1, 2) 的结果应该是 3。

Jest 还支持模拟函数,这是在测试中模拟复杂行为的一种方法。例如:

// users.js
function getUsers() {
  // 这个函数会从远程服务器获取用户
}

module.exports = getUsers;
// users.test.js
const getUsers = require('./users');

jest.mock('./users');

test('getUsers returns users', async () => {
  getUsers.mockResolvedValue(['John', 'Sally']);

  const users = await getUsers();

  expect(users).toEqual(['John', 'Sally']);
});

在这个例子中,我们使用 jest.mock 函数模拟了 getUsers 函数,使其返回一个预定义的值。这样我们就可以在不实际调用远程服务器的情况下测试这个函数。

Jest 还支持快照测试,这是一种用于测试 UI 是否发生意外更改的方法。例如:

// component.js
function Component() {
  return '<div>Hello, world!</div>';
}

module.exports = Component;
// component.test.js
const Component = require('./component');

test('Component renders correctly', () => {
  expect(Component()).toMatchSnapshot();
});

在这个例子中,我们使用 toMatchSnapshot 函数来生成一个快照。当测试运行时,Jest 会将 Component 的输出与之前保存的快照进行比较。如果输出发生了更改,测试就会失败。

以上只是 Jest 功能的一部分,Jest 还有许多其他的特性和选项,你可以在 Jest 的官方文档 中找到更多信息。

另外需要注意的是 在单元测试中 如果两个文件相互调用 这个的话 可能会导致运行结果报错 比如单测一个function 会报 xxx is not function

解决方案:

减少相互调用逻辑 或者可以通过mock function 进行测试 mock的话可能又不完全是我们想要的效果 毕竟我们想要的是测试我们项目中用到的文件或者函数

### 集成和配置 Jest 进行 Vue 2 单元测试 在 Vue 2 中设置并使用 Jest 来执行单元测试是一个常见的需求。以下是关于如何完成此操作的具体说明。 #### 安装依赖项 为了使 Jest 能够运行 Vue 组件的测试,需要安装一些必要的包: ```bash npm install --save-dev jest @vue/test-utils vue-jest babel-jest ``` 这些工具的作用如下: - `jest` 是核心库,用于编写和运行测试。 - `@vue/test-utils` 提供了一组实用程序来帮助渲染和交互 Vue 组件[^1]。 - `vue-jest` 和 `babel-jest` 则分别负责处理 `.vue` 文件以及通过 Babel 编译 JavaScript 代码[^4]。 #### 配置 Babel 由于 Jest 使用的是 Node.js 环境,默认情况下无法理解现代 ES6+ 的语法或者单文件组件 (SFC),因此需配置 Babel 将其转换为目标环境可识别的形式。 创建或更新项目的根目录下的 `.babelrc` 或者 `babel.config.js` 文件: ```json { "presets": ["@babel/preset-env"], "plugins": [] } ``` 如果项目已经存在其他预设,则只需确保包含上述内容即可满足基本需求。 #### 设置 Jest 测试环境 接下来定义适合 Vue 应用场景的 Jest 配置选项,在项目根路径下新建名为 `jest.config.js` 的文件,并填入以下内容: ```javascript module.exports = { moduleFileExtensions: ['js', 'json', 'vue'], transform: { '^.+\\.js$': 'babel-jest', '.*\\.(vue)$': 'vue-jest' }, testEnvironment: 'jsdom' // Simulates DOM environment required by Vue rendering. }; ``` 这里的关键点在于指定 `transform` 属性让不同类型的源码经过相应的处理器解析;另外还设置了模拟浏览器行为所需的 jsDOM 环境支持[^2]。 #### 创建 Mock 数据夹 有时可能希望拦截某些外部请求或其他副作用逻辑以便专注于被测功能本身的表现。按照官方建议可以建立专门存放假数据脚本的地方——即命名为 `__mocks__` 的子目录结构。 例如要伪造整个 axios HTTP 请求库的行为时可以在该位置添加类似这样的条目: ```javascript // __mocks__/axios.js export default { get: jest.fn(() => Promise.resolve({ data: [] })) }; ``` 这样当后续导入 Axios 实例的时候就会自动替换为我们自定义版本而无需担心真实网络通信干扰到本地验证过程。 #### 编写第一个简单的测试案例 最后一步就是实际动手尝试一下啦!假设有一个非常基础的小部件叫做 Counter.vue ,它允许用户点击按钮增加计数值显示出来。那么对应的 spec 文件大概会长这个样子: ```javascript import { shallowMount } from '@vue/test-utils'; import Counter from '@/components/Counter.vue'; describe('Counter.vue', () => { let wrapper; beforeEach(() => { wrapper = shallowMount(Counter); }); afterEach(() => { wrapper.destroy(); }); it('renders correctly with initial value set as zero.', () => { expect(wrapper.vm.$data.count).toBe(0); }); it('increments count on button click event.', async () => { const btn = wrapper.find('button'); await btn.trigger('click'); expect(wrapper.vm.$data.count).toBe(1); }); }); ``` 以上片段展示了怎样利用浅层挂载方式加载目标对象实例化后的上下文信息进而对其属性方法调用结果加以断言确认是否符合预期效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值