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

如何在浏览器/Jest+jsdom中编写在线编辑器粘贴集成测试?

实现剪贴板粘贴快捷键自动化测试的方案

方法一:Mock剪贴板API(Jest+jsdom环境)

在Jest结合jsdom的测试环境中,可直接Mock浏览器剪贴板API绕过安全限制:

  1. 提前Mock剪贴板读写方法与paste事件逻辑:
// 测试文件开头添加Mock
Object.defineProperty(navigator, 'clipboard', {
  writable: true,
  value: {
    writeText: jest.fn().mockResolvedValue(undefined),
    readText: jest.fn().mockResolvedValue('test')
  }
});

// 封装模拟粘贴的工具函数
function simulatePasteWithText(text) {
  navigator.clipboard.readText.mockResolvedValue(text);
  const pasteEvent = new ClipboardEvent('paste', {
    clipboardData: {
      getData: (type) => type === 'text/plain' ? text : ''
    }
  });
  document.querySelector('.your-editor-selector').dispatchEvent(pasteEvent);
}
  1. 编写符合预期结构的测试代码:
test('Ctrl+V粘贴功能正常', async () => {
  await navigator.clipboard.writeText('test');
  setEditorContent('value:');
  simulatePasteWithText('test');
  expectContent('value:test');
});

test('Ctrl+Shift+V粘贴功能正常', async () => {
  await navigator.clipboard.writeText('test');
  setEditorContent('value:');
  // 若为无格式粘贴,可调整Mock返回纯文本
  simulatePasteWithText('test');
  expectContent('value:test');
});

test('Shift+Ins粘贴功能正常', async () => {
  await navigator.clipboard.writeText('test');
  setEditorContent('value:');
  simulatePasteWithText('test');
  expectContent('value:test');
});

方法二:使用浏览器自动化工具(如Playwright/Cypress)

这类工具运行在受控真实浏览器环境中,可绕过剪贴板安全限制,更贴近用户实际操作:

以Playwright为例:

test('Ctrl+V粘贴功能正常', async ({ page }) => {
  await page.goto('/your-editor-page');
  await page.fill('.your-editor-selector', 'value:');
  await page.evaluate((text) => navigator.clipboard.writeText(text), 'test');
  await page.keyboard.press('Control+V');
  const content = await page.inputValue('.your-editor-selector');
  expect(content).toBe('value:test');
});

方法三:直接测试粘贴事件处理逻辑

提取编辑器核心粘贴处理函数,单独测试核心逻辑:

// 假设编辑器粘贴处理函数为handlePaste
function handlePaste(event) {
  const text = event.clipboardData.getData('text/plain');
  insertTextToEditor(text);
}

// 测试处理函数
test('粘贴处理函数能正确插入文本', () => {
  setEditorContent('value:');
  const mockEvent = {
    clipboardData: {
      getData: jest.fn().mockReturnValue('test')
    }
  };
  handlePaste(mockEvent);
  expectContent('value:test');
});

搭配快捷键绑定的简单验证(如确认Ctrl+V能触发handlePaste),即可完整覆盖测试需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:10:19