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

思路:

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

msw的使用

  1. 使用handlers配置匹配规则,MSW 1.0之后可以直接使用封装好的http和HttpResponse,无需使用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"才行
相关推荐
非优秀程序员2 小时前
第10章 千团出世|《互联网产品恩仇录》
前端
非优秀程序员2 小时前
第11章 小高在对面|《互联网产品恩仇录》
前端
非优秀程序员2 小时前
第14章 只剩美团|《互联网产品恩仇录》
前端
非优秀程序员2 小时前
第09章 老乡何必为难老乡|《互联网产品恩仇录》
前端
非优秀程序员3 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员3 小时前
第03章 三大门户,烽烟起于瀛海威|《互联网产品恩仇录》
前端
程序员大阳6 小时前
HTML+CSS+JS对话式实战(5)-活动管理页之查看报名名单的实现
javascript·css·html·查看报名名单
曦樂~7 小时前
【Web Development】02 CSS
前端·css
风骏时光牛马7 小时前
后端服务接口开发与数据逻辑处理
前端
东鹏特饮7 小时前
经典打砖块(Breakout)游戏
前端·css·css3