测试框架选择
- Jest + Testing Library:Jest是一个流行的JavaScript测试框架,提供了丰富的断言库和测试运行环境。Testing Library专注于测试用户界面,鼓励编写与用户实际交互相似的测试。
- Cypress:一个端到端(E2E)测试框架,特别适合测试复杂的用户交互,它可以模拟真实浏览器环境,方便地处理多级菜单展开、拖放等操作。
使用Jest + Testing Library模拟交互
- 安装依赖:
npm install --save-dev jest @testing-library/qwik @testing-library/jest-dom
- 多级菜单展开:
- 假设菜单组件有一个按钮用于展开菜单。首先渲染组件,然后找到按钮并触发点击事件,再断言菜单是否展开。
import { render, screen } from '@testing-library/qwik';
import MyMenuComponent from './MyMenuComponent';
test('Menu expands on button click', async () => {
render(<MyMenuComponent />);
const menuButton = screen.getByText('Expand Menu');
await userEvent.click(menuButton);
const menuItems = await screen.findAllByRole('listitem');
expect(menuItems.length).toBeGreaterThan(0);
});
- 在上述代码中,
userEvent
是 @testing-library/user - event
库中的,用于模拟用户操作。findAllByRole
用于找到菜单中的所有菜单项,通过断言菜单项数量来确认菜单展开。
- 拖放操作:
- 对于拖放操作,需要模拟鼠标按下、移动和释放等事件。可以借助
@testing-library/user - event
库。假设组件中有一个可拖动元素和一个目标区域。
import { render, screen } from '@testing-library/qwik';
import MyDragDropComponent from './MyDragDropComponent';
test('Drag - and - drop functionality works', async () => {
render(<MyDragDropComponent />);
const draggableElement = screen.getByTestId('draggable - element');
const targetElement = screen.getByTestId('target - element');
await userEvent.mouseDown(draggableElement);
await userEvent.move(targetElement);
await userEvent.mouseUp(targetElement);
// 断言拖放后目标区域的状态,比如检查目标区域是否包含了被拖动的元素
const droppedElement = await screen.queryByText('Element text in target');
expect(droppedElement).toBeInTheDocument();
});
使用Cypress模拟交互
- 安装依赖:
npm install --save-dev cypress
- 多级菜单展开:
- 在Cypress测试文件(例如
cypress/e2e/menu.spec.js
)中:
describe('Menu Interaction', () => {
it('Expands the menu on click', () => {
cy.visit('/your - component - url');
cy.get('[data - testid="menu - button"]').click();
cy.get('[data - testid="menu - item"]').should('be.visible');
});
});
cy.visit
用于访问包含组件的页面,cy.get
用于选择元素,通过 click
方法模拟点击,should
用于断言菜单是否展开。
- 拖放操作:
- 在Cypress测试文件(例如
cypress/e2e/drag - drop.spec.js
)中:
describe('Drag - and - drop Interaction', () => {
it('Drags an element to target', () => {
cy.visit('/your - component - url');
cy.get('[data - testid="draggable - element"]')
.trigger('mousedown', { which: 1 })
.trigger('mousemove', { clientX: cy.get('[data - testid="target - element"]').first().position().left, clientY: cy.get('[data - testid="target - element"]').first().position().top })
.trigger('mouseup', { which: 1 });
cy.get('[data - testid="target - element"]').should('contain', 'Element text');
});
});
- 这里通过
trigger
方法模拟鼠标的按下、移动和释放事件,最后断言目标区域是否包含了被拖动元素的文本。