You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Puppeteer中使用设备模拟器先后运行桌面及移动端Jest测试用例

Jest 双视口全量测试实现方案

适用于所有.test.ts后缀的测试用例,无需修改单测内部逻辑,即可实现「先全量跑桌面端用例、再全量跑移动端用例」的需求,默认基于Jest + jsdom组件测试场景实现:

  • 第一步:确认基础依赖
    如果还没装jsdom测试环境,先执行安装命令:
    npm i -D jest-environment-jsdom
    然后在jest.config.ts里确认基础配置正确,原有配置不用改动,确保能匹配到所有.test.ts文件即可:

    export default {
      testEnvironment: "jsdom",
      testMatch: ["**/*.test.ts"],
      // 你项目里原有的其他Jest配置全部保留
    }
    
  • 第二步:编写分端视口初始化文件
    在项目根目录新建两个测试前置配置文件,分别处理桌面、移动端的视口mock:
    第一个是jest.desktop.setup.ts,对应桌面端视口:

    // 桌面端测试全局前置逻辑
    beforeAll(() => {
      // 模拟桌面常用视口尺寸 1920*1080
      Object.defineProperty(window, "innerWidth", {
        writable: true,
        configurable: true,
        value: 1920,
      });
      Object.defineProperty(window, "innerHeight", {
        writable: true,
        configurable: true,
        value: 1080,
      });
    
      // 如果项目用matchMedia做响应式判断,补全mock
      Object.defineProperty(window, "matchMedia", {
        writable: true,
        value: jest.fn().mockImplementation((query) => ({
          matches: window.innerWidth >= 768, // 768替换成你项目实际的移动端断点值
          media: query,
          onchange: null,
          addListener: jest.fn(),
          removeListener: jest.fn(),
          addEventListener: jest.fn(),
          removeEventListener: jest.fn(),
          dispatchEvent: jest.fn(),
        })),
      });
    
      // 触发resize事件让响应式逻辑生效
      window.dispatchEvent(new Event("resize"));
    });
    

    第二个是jest.mobile.setup.ts,对应移动端视口:

    // 移动端测试全局前置逻辑
    beforeAll(() => {
      // 模拟移动端常用视口尺寸 375*812
      Object.defineProperty(window, "innerWidth", {
        writable: true,
        configurable: true,
        value: 375,
      });
      Object.defineProperty(window, "innerHeight", {
        writable: true,
        configurable: true,
        value: 812,
      });
    
      // 同桌面端,补全matchMedia mock
      Object.defineProperty(window, "matchMedia", {
        writable: true,
        value: jest.fn().mockImplementation((query) => ({
          matches: window.innerWidth >= 768,
          media: query,
          onchange: null,
          addListener: jest.fn(),
          removeListener: jest.fn(),
          addEventListener: jest.fn(),
          removeEventListener: jest.fn(),
          dispatchEvent: jest.fn(),
        })),
      });
    
      window.dispatchEvent(new Event("resize"));
    });
    
  • 第三步:配置运行脚本
    打开项目根目录的package.json,在scripts字段里添加三个命令:

    {
      "scripts": {
        "test:desktop": "jest --setupFilesAfterEnv='./jest.desktop.setup.ts'",
        "test:mobile": "jest --setupFilesAfterEnv='./jest.mobile.setup.ts'",
        "test": "npm run test:desktop && npm run test:mobile"
      }
    }
    

配置完成后直接执行npm test即可:Jest会先加载桌面端配置,把所有10个.test.ts用例全部跑完,桌面端执行结束后自动加载移动端配置,重新把全部10个用例在移动端视口下跑一遍,不用修改任何现有测试用例的代码。

如果是做E2E测试(比如Jest配合Playwright/Puppeteer),逻辑完全一致,只需要把两个setup文件里的jsdom视口mock,替换成对应测试框架的视口切换API即可,脚本执行顺序不用改。

内容的提问来源于stack exchange,提问作者Sriram Sundar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:57:33