使用msw+vitest测试Nextjs Server Action(最新版)

思路:

  1. action中发请求
  2. handlers拦截这个请求,返回数据

msw的使用

  1. 使用handlers配置匹配规则,MSW 1.0之后可以直接使用封装好的httpHttpResponse,无需使用rest
  2. 拦截浏览器中的请求应使用setupWorker,拦截node环境中的请求应使用setupServer,所以测试server action使用setupServer
  3. 需要注意,setupServer需要一个持久化 Node.js 进程,所以常常使用在单独的测试进程中,比如使用Vitest
  4. 如果想将msw放在本地开发服务器上,为了防止热重载造成状态丢失,需要在根layout文件中的RootLayout函数之外直接调用server.listen()

Vitest使用

  1. 创建测试入口文件vitest.setup.ts,写入:

    javascript 复制代码
    import { beforeAll, afterEach, afterAll } from 'vitest';
    import { server } from './mocks/server';
    
    // 测试前,启动服务端拦截
    beforeAll(() => {
      server.listen({ onUnhandledRequest: 'warn' });
    });
    
    // 每个测试结束后,重置处理器(防止测试间互相污染)
    afterEach(() => {
      server.resetHandlers();
    });
    
    // 所有测试完成后,关闭拦截器
    afterAll(() => {
      server.close();
    });
  2. 创建配置文件vitest.config.ts,写入:

    php 复制代码
    import { defineConfig } from 'vitest/config';
    
    export default defineConfig({
      test: {
        // 指定刚才写的 setup 文件位置
        setupFiles: ['./vitest.setup.ts'],
    
        // 如果需要测试环境为 "jsdom"(测试 React 组件)或 "node"(仅测后端逻辑),可在这里配置
        environment: 'node', 
      },
    });
  3. 创建/src/__test__文件夹,创建测试文件actions.test.ts(比如我要测试action.ts),写入:

    javascript 复制代码
    // __tests__/actions.test.ts
    import { test, expect } from 'vitest';
    import { getData } from '@/app/actions';
    
    test('Mock server action fetch', async () => {
      const data = await getData();
      const mockData={
    	  id:1,
    	  name:"Hello from MSW"
      }
      expect(data).toEqual(mockData);
    })
  4. package.json 里添加脚本"test": "vitest",运行pnpm test即可

注意事项:

  1. https://randomuser.me/api/?results=3&inc=name,gender,email,nat,picture&noinfo返回的数据需要解构出results使用
  2. action.ts中使用的其他文件中的函数,那个文件必须显式标注成"use server"才行
相关推荐
前端大卫6 小时前
Vue3 + Element-Plus 自定义虚拟表格滚动实现方案【附源码】
前端
却尘6 小时前
Next.js 请求最佳实践 - vercel 2026一月发布指南
前端·react.js·next.js
ccnocare6 小时前
浅浅看一下设计模式
前端
Lee川6 小时前
🎬 从标签到屏幕:揭秘现代网页构建与适配之道
前端·面试
Ticnix6 小时前
ECharts初始化、销毁、resize 适配组件封装(含完整封装代码)
前端·echarts
纯爱掌门人6 小时前
终焉轮回里,藏着 AI 与人类的答案
前端·人工智能·aigc
twl6 小时前
OpenClaw 深度技术解析
前端
崔庆才丨静觅6 小时前
比官方便宜一半以上!Grok API 申请及使用
前端
星光不问赶路人7 小时前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼7 小时前
shadcn/ui,给你一个真正可控的UI组件库
前端