Project Icon

msw

网络级别API模拟库 支持REST和GraphQL

Mock Service Worker是一个用于浏览器和Node.js的API模拟库。它通过网络级别拦截请求,可以模拟REST和GraphQL API响应。MSW采用类似Express的路由语法,支持灵活的请求匹配和响应定制。这个工具适用于开发、测试等多种场景,为前后端分离开发提供了便利。

MSW 2.0终于来了!🎉 阅读发布说明,请按照迁移指南进行升级。如果在升级过程中有任何问题,请在我们的Discord服务器上联系我们。

我们还录制了迄今为止最全面的MSW介绍。在我们的官方视频课程中学习如何像专业人士一样模拟API:

使用Mock Service Worker模拟REST和GraphQL API

Mock Service Worker标志

Mock Service Worker

Mock Service Worker (MSW) 是一个适用于浏览器和Node.js的无缝REST/GraphQL API模拟库。

包版本 每月下载量 Discord服务器



特性

  • 无缝集成。为您提供专用的请求拦截层。使您的应用程序代码和测试不知道是否有模拟。
  • 无偏差。请求相同的生产资源并测试应用程序的实际行为。增强现有API,或在没有API的情况下边设计边使用。
  • 熟悉且强大。使用类似Express的路由语法来拦截请求。使用参数、通配符和正则表达式匹配请求,并以必要的状态码、标头、cookie、延迟或完全自定义的解析器进行响应。

"我发现了MSW,非常兴奋,因为不仅我仍然可以在DevTools中看到模拟的响应,而且这些模拟不必写在Service Worker中,而可以与应用程序的其他部分放在一起。这使得采用变得非常容易。我还可以将其用于测试,这使MSW成为一个巨大的生产力提升工具。"

Kent C. Dodds

文档

本README将简要介绍该库,但开始使用Mock Service Worker的最佳地点莫过于其官方文档。

示例

浏览器

工作原理

在浏览器中的使用是Mock Service Worker与其他工具的区别所在。利用Service Worker API(可以出于缓存目的拦截请求),Mock Service Worker在网络层面用您的模拟定义响应被拦截的请求。这样,您的应用程序对模拟一无所知。

看看这个关于Mock Service Worker在浏览器中如何工作的快速演示:

什么是Mock Service Worker?

有何不同?

  • 该库在网络层面拦截请求,这意味着是在请求已经执行并"离开"您的应用程序之后。因此,您的全部代码都会运行,在模拟时给您更多信心;
  • 想象您的应用程序是一个盒子。市面上的每个API模拟库都会打开您的盒子,移除发出请求的部分,用一个黑盒代替。Mock Service Worker保持您的盒子完整,与生产环境中的一模一样。相反,MSW存在于您的盒子旁边的一个单独的盒子中;
  • 不再需要stub fetchaxiosreact-query等;
  • 您可以在单元测试、集成测试和E2E测试中重用相同的模拟定义。我们是否提到过本地开发和调试?没错。所有这些都针对相同的网络描述运行,无需适配器或臃肿的配置。

使用示例

// src/mocks.js
// 1. 导入库。
import { http, HttpResponse } from 'msw'
import { setupWorker } from 'msw/browser'

// 2. 使用请求处理程序描述网络行为。
const worker = setupWorker(
  http.get('https://github.com/octocat', ({ request, params, cookies }) => {
    return HttpResponse.json(
      {
        message: '模拟响应',
      },
      {
        status: 202,
        statusText: '模拟状态',
      },
    )
  }),
)

// 3. 通过启动Service Worker开始请求拦截。
await worker.start()

在您的应用程序中执行 GET https://github.com/octocat 请求将得到一个模拟响应,您可以在浏览器的"Network"选项卡中检查:

Chrome DevTools Network截图,显示请求被模拟

提示: 您知道吗,虽然Service Worker在单独的线程中运行,但您的模拟定义完全在客户端执行?这样,您可以使用相同的语言,如TypeScript、第三方库和内部逻辑来创建所需的模拟。

Node.js

工作原理

Node.js中没有Service Workers。相反,MSW实现了一个低级拦截算法,可以利用与浏览器相同的请求处理程序。这模糊了环境之间的界限,让您可以专注于网络行为。

有何不同?

  • 不会stub fetchaxios等。因此,您的测试对模拟一无所知;
  • 您可以在本地开发、调试以及测试中重用相同的请求处理程序。真正做到了跨所有环境和所有工具的网络行为单一真相来源。

使用示例

看看这个使用React Testing Library和Mock Service Worker的Vitest集成测试示例:

// test/Dashboard.test.js

import React from 'react'
import { http, HttpResponse } from 'msw'
import { setupServer } from 'msw/node'
import { render, screen, waitFor } from '@testing-library/react'
import Dashboard from '../src/components/Dashboard'

const server = setupServer(
  // 使用请求处理程序描述网络行为。
  // 提示:将处理程序移到它们自己的模块中,
  // 并在浏览器和Node.js设置中导入它们!
  http.get('/posts', ({ request, params, cookies }) => {
    return HttpResponse.json([
      {
        id: 'f8dd058f-9006-4174-8d49-e3086bc39c21',
        title: `测试时避免嵌套`,
      },
      {
        id: '8ac96078-6434-4959-80ed-cc834e7fef61',
        title: `我如何在2021年构建现代网站`,
      },
    ])
  }),
)

// 启用请求拦截。
beforeAll(() => server.listen())

// 重置处理程序,以便每个测试都可以修改它们
// 而不影响其他不相关的测试。
afterEach(() => server.resetHandlers())

// 不要忘记在之后清理。
afterAll(() => server.close())

it('显示最近帖子列表', async () => {
  render(<Dashboard />)

  // 🕗 等待帖子请求完成。
  await waitFor(() => {
    expect(
      screen.getByLabelText('正在获取最新帖子...'),
    ).not.toBeInTheDocument()
  })

  // ✅ 断言正确的帖子已加载。
  expect(
    screen.getByRole('link', { name: /测试时避免嵌套/ }),
  ).toBeVisible()

  expect(
    screen.getByRole('link', { name: /我如何在2021年构建现代网站/ }),
  ).toBeVisible()
})

不要被淹没!我们准备了一步步的入门指南教程,您可以按照它学习如何将Mock Service Worker集成到您的项目中。

尽管API被称为setupServer,但实际上并不涉及任何服务器!选择这个名称是为了让人熟悉,API的设计旨在模仿操作实际服务器。

赞助商

Mock Service Worker受到全球数十万工程师的信赖。它被Google、Microsoft、Spotify、Amazon等公司以及无数其他公司使用。尽管如此,这个库仍然是一个在业余时间维护的业余项目,没有机会在财务上支持哪怕一个全职贡献者。

您可以改变这一点! 考虑赞助这个围绕API模拟的最具创新方法之一的努力。与您的老板和同事讨论开源赞助的话题。让我们一起构建可持续的开源!

金牌赞助商

成为我们的金牌赞助商,您的信息将直接展示在这里,同时享受其他特权,如问题优先处理和与我们的个人咨询会议。

在我们的GitHub赞助商页面了解更多


银牌赞助商

成为我们的银牌赞助商,您的个人资料图片和链接将在此处展示。

在我们的GitHub赞助商页面了解更多


项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号