Skip to content

模拟请求

由于 Vitest 运行在 Node 中,模拟网络请求很棘手;Web API 不可用,所以我们需要某种东西来为我们模拟网络行为。我们推荐使用 Mock Service Worker 来完成此任务。它允许你模拟 httpWebSocketGraphQL 网络请求,并且不依赖特定框架。

Mock Service Worker (MSW) 通过拦截测试发出的请求来工作,允许你使用它而无需更改任何应用程序代码。在浏览器中,它使用 Service Worker API。在 Node.js 中,以及对于 Vitest,它使用 @mswjs/interceptors 库。要了解有关 MSW 的更多信息,请阅读他们的 介绍

配置

你可以在 设置文件 中如下使用它

js
import { afterAll, afterEach, beforeAll } from 'vitest'
import { setupServer } from 'msw/node'
import { http, HttpResponse } from 'msw'

const posts = [
  {
    userId: 1,
    id: 1,
    title: 'first post title',
    body: 'first post body',
  },
  // ...
]

export const restHandlers = [
  http.get('https://rest-endpoint.example/path/to/posts', () => {
    return HttpResponse.json(posts)
  }),
]

const server = setupServer(...restHandlers)

// 在所有测试之前启动服务器
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))

// 在所有测试之后关闭服务器
afterAll(() => server.close())

// 在每个测试之后重置处理程序以实现测试隔离
afterEach(() => server.resetHandlers())
js
import { afterAll, afterEach, beforeAll } from 'vitest'
import { setupServer } from 'msw/node'
import { graphql, HttpResponse } from 'msw'

const posts = [
  {
    userId: 1,
    id: 1,
    title: 'first post title',
    body: 'first post body',
  },
  // ...
]

const graphqlHandlers = [
  graphql.query('ListPosts', () => {
    return HttpResponse.json({
      data: { posts },
    })
  }),
]

const server = setupServer(...graphqlHandlers)

// 在所有测试之前启动服务器
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))

// 在所有测试之后关闭服务器
afterAll(() => server.close())

// 在每个测试之后重置处理程序以实现测试隔离
afterEach(() => server.resetHandlers())
js
import { afterAll, afterEach, beforeAll } from 'vitest'
import { setupServer } from 'msw/node'
import { ws } from 'msw'

const chat = ws.link('wss://chat.example.com')

const wsHandlers = [
  chat.addEventListener('connection', ({ client }) => {
    client.addEventListener('message', (event) => {
      console.log('Received message from client:', event.data)
      // 将接收到的消息回显给客户端
      client.send(`Server received: ${event.data}`)
    })
  }),
]

const server = setupServer(...wsHandlers)

// 在所有测试之前启动服务器
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))

// 在所有测试之后关闭服务器
afterAll(() => server.close())

// 在每个测试之后重置处理程序以实现测试隔离
afterEach(() => server.resetHandlers())

将服务器配置为 onUnhandledRequest: 'error' 可确保每当存在没有相应请求处理程序的请求时,都会抛出错误。

更多

MSW 还有更多功能。你可以访问 cookies 和查询参数,定义模拟错误响应,以及更多!要查看使用 MSW 可以做的所有事情,请阅读 他们的文档