使用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"才行
相关推荐
GISer_Jing15 分钟前
AI原生前端工程化进阶实践:从流式交互架构到端云协同全链路落地
前端·人工智能·后端·学习
被考核重击18 分钟前
Vue响应式原理(下)
前端·javascript·vue.js
ZC跨境爬虫9 小时前
跟着 MDN 学 HTML day_9:(信件语义标记)
前端·css·笔记·ui·html
前端老石人9 小时前
HTML 字符引用完全指南
开发语言·前端·html
matlab_xiaowang9 小时前
Redux 入门:JavaScript 可预测状态管理库
开发语言·javascript·其他·ecmascript
幼儿园技术家9 小时前
前端如何设计权限系统(RBAC / ABAC)?
前端
前端摸鱼匠11 小时前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker11 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding13 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马13 小时前
Raku正则匹配与数据批量处理实操案例
前端