全屏 api 测试需模拟全局方法与属性、触发真实事件,覆盖调用逻辑、错误处理和状态响应;不测真实全屏效果,只验是否按约定调用。

全屏 API(requestFullscreen、exitFullscreen、fullscreenElement 等)是浏览器环境特有的 DOM API,无法在 Node.js 或纯 JS 环境中直接运行。因此测试它的包装类,核心思路是:不测浏览器行为本身,而测你对它的调用逻辑、错误处理、状态响应是否符合预期 —— 通过 模拟(mock)全局 API + 触发真实事件(如 fullscreenchange)来覆盖分支。
1. 模拟全屏相关全局属性和方法
在 Jest(最常用)或 Vitest 中,需在测试前手动挂载或替换 document 上的全屏方法和属性。注意不同浏览器前缀(如 webkitRequestFullscreen),但现代测试只需覆盖标准名即可,除非你的包装类显式兼容旧版。
- 用
Object.defineProperty或直接赋值模拟document.fullscreenElement(注意它是只读 getter,需用configurable: true) - 把
requestFullscreen、exitFullscreen替换为 jest.fn(),并返回 Promise(因为原生方法返回 Promise) - 记得在每个 test 前清理(
beforeEach)或恢复(afterEach),避免测试间污染
2. 测试包装类的核心行为分支
假设你有一个 FullScreenManager 类,提供 enter()、exit()、toggle() 和 isInFullscreen() 方法。你需要覆盖:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
成功进入全屏:调用
element.requestFullscreen(),断言 Promise resolve,且后续fullscreenElement变为该元素 -
进入失败(如用户拒绝):mock
requestFullscreen抛出错误(new Error('Fullscreen denied')),验证你的包装类是否正确 reject 并透传错误 -
退出全屏:调用
document.exitFullscreen(),断言被调用,且fullscreenElement变为null -
状态同步:手动触发
fullscreenchange事件(document.dispatchEvent(new Event('fullscreenchange'))),验证你的监听器是否更新内部状态、触发回调或 emit 事件
3. 处理跨浏览器差异和降级逻辑
如果你的包装类做了前缀适配(比如 fallback 到 webkitRequestFullscreen),测试时要分别 mock 不同属性名,并验证它在对应环境下调用的是正确的函数。例如:
- 设置
document.webkitFullscreenElement存在,但标准属性不存在 → 验证它使用 webkit 分支 - 移除所有全屏相关属性 → 验证
isSupported()返回false,且enter()立即 reject
4. 不要测“能否真全屏”,而要测“是否按约定调用”
全屏 API 的实际效果(如是否弹出浏览器提示、是否真正铺满屏幕)属于 E2E 范畴,单元测试无需也无法覆盖。重点验证:
- 你传给
requestFullscreen()的是不是目标元素 - Promise 的 resolve/reject 是否符合文档约定(如拒绝时带
DOMException) - 事件监听是否绑定/解绑正确(尤其注意内存泄漏风险)
- 状态 getter(如
isInFullscreen())是否实时反映document.fullscreenElement值
不复杂但容易忽略。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










