Jest中的mock

本文介绍了Jest中mock函数的使用,包括捕获函数调用、返回结果、this指向和调用顺序,以及自由设置返回结果和改变内部函数实现。通过jest.fn()和jest.mock(),我们可以模拟函数行为,尤其在测试异步请求如axios时,能避免真实网络请求,提高测试效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jest中mock的作用:

  • mock函数,捕获函数的调用 和 返回结果 以及 this指向 和 调用顺序.
  • 可以让我们自由的设置返回结果.
  • 改变内部函数的实现.

业务代码

import axios from 'axios'

export const runCallback = (callback) => {
	callback()
}

export const getData = () => {
  return axios.get('/api').then(res => res.data)
}
1.捕获函数的调用 和 返回结果 以及 this指向 和 调用顺序

测试代码:

import { runCallback, getData } from './demo'

test.only('测试 runCallback', () => {
  const func = jest.fn() //1. mock函数,捕获函数的调用 和 返回结果 以及 this指向 和 调用顺序
  // 改变this指向
  // func.mockImplementation(() => {
  //   return this
  // })

  func.mockReturnThis() // 等价于上边的mockImplementation

  runCallback(func) 
  runCallback(func)
  runCallback(func)
  expect(func.mock.calls.length).toBe(3) // 断言:断定什么样的内容会有什么样的结果
  // expect(func).toBeCalled() // 匹配函数func是否被执行
  console.log(func.mock)
})
  • jest.fn() 可捕获函数的调用 和 返回结果 以及 this指向 和 调用顺序.
2.可以让我们自由的设置返回结果
import { runCallback, getData } from './demo'

test.only('测试 runCallback', () => {
  const func = jest.fn() 
  // 2.可以让我们自由的设置返回结果
  func.mockReturnValueOnce('riona-cheng') // 函数执行第一次时,模拟返回结果为'riona-cheng'
  func.mockReturnValueOnce('aaa') // 函数执行第二次时,模拟返回结果为'aaa'
  func.mockReturnValueOnce('bbb') // 函数执行第三次时,模拟返回结果为'bbb'

  runCallback(func) 
  runCallback(func)
  runCallback(func)
  expect(func.mock.calls.length).toBe(3) // 断言:断定什么样的内容会有什么样的结果
  // expect(func.mock.results[0].value).toBeUndefined()
  // expect(func).toBeCalled() // 匹配函数func是否被执行
  console.log(func.mock)
})

测试结果:返回值为我们分别设置的值

3.改变内部函数的实现

mock测试异步axios请求:

import { runCallback, getData } from './demo'
import axios from 'axios'
jest.mock('axios') // 让jest对axios做一个模拟

/** 
 * 
 { calls: [ [], [] ], // 被调用了多少次 以及 传入参数
      instances: [ undefined, undefined ], // 每次func运行时,this的指向
      invocationCallOrder: [ 1, 2 ], // 执行顺序
      results: // 每次函数执行的返回结果
       [ { type: 'return', value: undefined },
         { type: 'return', value: undefined } ] }
 *  */ 

// 对前端测试,只需要测试请求发送了即可,至于具体返回什么,是后端负责测试的
// 3.改变函数的内部实现,之前是异步发请求,现在是同步的模拟数据
test('测试 getData', async () => {
  // axios.get.mockResolvedValue({data: 'hello'})
  // await getData().then(res => {
  //   expect(res).toBe('hello')
  // })

  // 模拟多次请求返回不同结果
  axios.get.mockResolvedValueOnce({data: 'hello'})
  axios.get.mockResolvedValueOnce({data: 'world'})
  await getData().then(res => {
    expect(res).toBe('hello')
  })

  await getData().then(res => {
    expect(res).toBe('world')
  })
})
  • jest.mock(‘axios’) 让jest对axios做一个模拟. 在测试用例中即可用同步代码模拟数据,不需要发送真实的请求。

知识补充

  • test.only : 只执行当前的测试用例代码.
  • expect().toBe() 这种语句被称为断言:断定什么样的内容会有什么样的结果.
  • mock函数的mock属性:
/** 
 { calls: [ [], [] ], // 被调用了多少次 以及 传入参数
      instances: [ undefined, undefined ], // 每次func运行时,this的指向
      invocationCallOrder: [ 1, 2 ], // 执行顺序
      results: // 每次函数执行的返回结果
       [ { type: 'return', value: undefined },
         { type: 'return', value: undefined } ] }
 **/ 
### 如何在 IntelliJ IDEA 中创建 Spring Boot 项目 #### 准备工作 为了顺利创建一个 Spring Boot 项目,在开始之前需要确认已经安装并配置好了以下环境: - **Java JDK**:确保本地已安装适合的 Java 版本。 - **IntelliJ IDEA**:推荐使用 Ultimate 版本,因为它内置了对 Spring 的支持[^1]。 --- #### 创建 Spring Boot 项目的具体步骤 1. 打开 IntelliJ IDEA 并点击 `File` -> `New` -> `Project...` 来启动新建项目向导。 2. 在弹出的新建项目窗口中,选择左侧列表中的 `Spring Initializr`。这一步是基于官方提供的模板服务自动生成基础结构[^1]。 3. 配置 Maven 或 Gradle 构建工具的相关参数: - **Group**: 定义 Maven 工程的 GroupId,通常为公司域名反写形式(如 com.example)。 - **Artifact**: 输入模块名作为 ArtifactId,注意不能包含大写字母[^2]。 - **Name**: 自定义项目名称。 - **Package Name**: 自动生成的基础包路径。 - **Packaging**: 默认选择 jar 包即可,因为 Spring Boot 内嵌 Tomcat 支持通过命令行直接运行 jar 文件。 4. 如果国内网络访问速度较慢,可以选择替换默认的初始化 URL 地址为阿里云镜像站点 https://start.aliyun.com/,从而提高下载效率[^3]。 5. 进入依赖管理界面后勾选所需的 Starter Dependencies,对于基本 Web 应用只需添加 `Spring Web` 即可完成核心功能引入。 6. 点击下一步直至最终生成完毕,此时应该能看到标准目录布局下的 src/main/java 和 resources 子文件夹[^1]。 7. 编辑器会自动加载 pom.xml (如果是 Maven) 或 build.gradle (如果是 Gradle),其中列出了所有必要的库版本号等信息。 8. 启动应用程序类上的 main 方法验证是否成功部署到内存中的服务器实例上。 --- ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` --- #### 常见问题排查 如果按照以上流程操作仍然遇到异常情况,则可以从以下几个角度入手解决: - 检查互联网连接状态良好与否; - 更改仓库源至更稳定的地址比如阿里的开源镜像站; - 查看日志输出定位具体的错误提示语句进一步分析原因所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值