当前位置: 首页 > 知识库问答 >
问题:

前端 - 使用了vitest 的mocking功能,就不必再引入mockjs是吗?

魏澄邈
2024-10-11

mockjs 的功能是模拟数据:
http://mockjs.com

请问vitest 里面的mocking功能:
https://cn.vitest.dev/guide/mocking

是否是指的和mockjs一样的功能,用于模拟数据使用呢?
也就是说使用了vitest 的mocking功能,就不必再引入mockjs,是吗?

共有2个答案

巫马星雨
2024-10-11

功能上的区别就不提了,估计你想问的也只是关于 AJAX 这一块。

它俩的侧重点和应用的阶段不一样。


前者原理是拦截了浏览器环境下的 XHR,一般是应用在开发阶段,它是跑在浏览器里的

现在很多都是前后端分离开发,前端所需的数据都通过 AJAX 取自后端接口。那么很多时候就有一个问题,前端需要某些边界场景的数据,后端没有能力提供给你、或者能提供但成本很高,该怎么办?

要是还不能理解,我就随便举几个场景的例子:

  1. 已有接口文档,但因为前后端同时介入开发,前端开发到某个页面时需要接口数据,后端因为工期缘故还没开发完、调不通。
  2. 某个业务流程需要用户 VIP9 级以上、且当天消费金额达到 100 元才能触发,但因为种种原因现在无法提供这样的测试账号。
  3. ...

这种场景下你要是作为前端,要么就只能等着后端,要么就得自己改代码想办法模拟数据(比如场景二里你把 if 判断条件改了好方便自己触发)。但你等着了 deadline 可不等你;自己模拟数据如果是在视图层改的话侵入性又太强、如果涉及组件多的话可能得改好几处、最后再忘记改回去了可就操蛋了。

于是大家就想,既然直接在视图层里去模拟数据侵入性强,那我在源头 —— 也就是 AJAX 这层 —— 直接给视图层返回一个模拟的响应不就好了?于是 mockjs 就应运而生了。


后者一般应用在测试阶段,或者开发阶段里 CI/CD 流程的单测阶段,它是跑在 Node 里的

这个就纯粹是单测用例需要模拟数据了,不展开讲了。

至于为啥单测也要模拟数据,那可能就非常多了。比如只是为了验证某流程是否能跑通,并不需要真实地调用接口,否则跑一次单测后端产生一堆垃圾数据,即便有测试环境也挺闹心。或者说这个用例并不跟后端接口强耦合,否则后端的接口一旦挂了,结果你前端的用例跑不通了,不也很奇怪?

穆智刚
2024-10-11

答案

Vitest 的 mocking 功能与 Mock.js 的功能并不完全相同,尽管它们都可以用于模拟数据,但它们的用途和上下文有所不同。

  • Vitest 的 mocking 功能:主要用于在测试环境中模拟模块、函数、方法等的返回值或行为。这在你需要测试某个组件或函数,但不想依赖其外部依赖(如 API 调用、数据库访问等)时非常有用。Vitest 的 mocking 允许你控制这些依赖的返回值,从而专注于测试你的代码逻辑。
  • Mock.js:则是一个专门用于生成随机数据,拦截 Ajax 请求并返回模拟数据的库。它主要用于前端开发中,模拟后端 API 返回的数据,以便在开发过程中不依赖后端服务即可进行前端开发。

因此,使用了 Vitest 的 mocking 功能,并不意味着你就不需要 Mock.js。如果你的测试场景需要模拟外部数据(如 API 响应),并且你正在使用 AJAX 或 Fetch 等技术来请求这些数据,那么 Mock.js 可能仍然是一个有用的工具。然而,如果你的测试场景主要关注于模块或函数的内部逻辑,并且你只需要模拟这些模块或函数的返回值,那么 Vitest 的 mocking 功能可能就足够了。

简而言之,两者各有其用,选择哪个取决于你的具体需求和测试场景。

 类似资料:
  • 1、是否PC没有GPU显卡,就不能使用WebGPU的API?或着说是否是会转移到CPU进行计算导致性能不好? 2、WebGL和WebGPU的关系是什么?

  • VScode 的终端没有默认的盘符,选择默认配置文件为空, vscode是以管理员身份运行的,且在window PowerShell中是允许执行的,之前还可以用,不知道怎么回事终端就用不了了

  • vitest测试报错? 按照这篇教程我配置了测试环境来测试react组件,但是报错了,不知道为什么? 环境的介绍 用vite来构建我们的项目 安装vitest、jsdom、@testing-library/react、@testing-library/jsdom 在根目录下创建testSetup.js 修改vite.config.js 修改package.json文件 React组件 测试 报错

  • 问题内容: 创建自己的Activity子类时,我们将覆盖一些基本的Activity生命周期功能。 我们 必须 在其中哪些方法中称为超级实现, 应该 在哪里以及 只有什么好方法 ? 方法列表不是最终的,请随时添加更多功能,在哪里应该知道该怎么做。 问题答案: 必须: 应该/不应该:( 调用超类方法可能会有所帮助,除非您自己管理活动的状态或故意更改活动的行为-在这种情况下可能是有害的) 实际上,重写任

  • 我最近一直在玩Jetpack Compose,我已经完成了这里的基本教程。然后我开始查看他们的Jetnews示例项目。现在我已经准备好开始自己的项目,但现在当我在Jetnewssample项目的同一父目录中创建一个新项目时,Android Studio无法再导入androidx.ui.core。文本或androidx.ui.core.setContent。我可以从同一位置导入其他类,但现在我只收到

  • watch监听里面使用foreach就陷入死循环,为什么? 我想过滤掉type != 2的数据,不用在表格渲染出来