关于 react-native-testing
面向 React Native 开发者的测试学习技能,涵盖从单元与组件测试到端到端测试的策略,并包括原生模块模拟和 CI/CD 测试流水线设置。
主要功能
- 01Jest 配置
- 02组件与 Hook 测试
- 03模拟原生模块和 API
- 04使用 Detox 或 Maestro 做端到端测试
- 05设置 CI/CD 测试流水线
适用场景
- 01为 React Native 项目配置 Jest
- 02验证组件交互和 Hook 行为
- 03模拟原生模块或 API
- 04测试端到端用户流程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pluginagentmarketplace/ custom-plugin-react-native --skill react-native-testing安装后在 Claude Code 中输入/react-native-testing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/config.yamlschema.jsonreferences/GUIDE.mdPATTERNS.mdscripts/validate.py详细介绍
React Native 测试技能
学习全面的测试策略,包括单元测试、组件测试和 E2E 测试。
前置条件
- React Native 基础知识
- 了解 async/await
- 熟悉测试概念
学习目标
完成此技能后,你将能够:
- 为 React Native 配置 Jest
- 使用 Testing Library 编写组件测试
- 模拟原生模块和 API
- 使用 Detox/Maestro 实施 E2E 测试
- 设置 CI/CD 测试流水线
涵盖主题
1. Jest 设置
// jest.config.js
module.exports = {
preset: 'react-native',
setupFilesAfterEnv: ['@testing-library/jest-native/extend-expect'],
transformIgnorePatterns: [
'node_modules/(?!(react-native|@react-native)/)',
],
};
2. 组件测试
import { render, screen, fireEvent } from '@testing-library/react-native';
import { Button } from './Button';
describe('Button', () => {
it('calls onPress when pressed', () => {
const onPress = jest.fn();
render(<Button title="Click" onPress={onPress} />);
fireEvent.press(screen.getByText('Click'));
expect(onPress).toHaveBeenCalled();
});
});
3. Hook 测试
import { renderHook, act } from '@testing-library/react-native';
import { useCounter } from './useCounter';
describe('useCounter', () => {
it('increments count', () => {
const { result } = renderHook(() => useCounter());
act(() => result.current.increment());
expect(result.current.count).toBe(1);
});
});
4. 模拟
// Mock native module
jest.mock('@react-native-async-storage/async-storage', () => ({
setItem: jest.fn(),
getItem: jest.fn(),
}));
// Mock API
jest.mock('./api', () => ({
fetchUser: jest.fn().mockResolvedValue({ id: '1', name: 'Test' }),
}));
5. 使用 Detox 进行 E2E 测试
describe('Login', () => {
beforeAll(async () => {
await device.launchApp();
});
it('should login successfully', async () => {
await element(by.id('email')).typeText('[email protected]');
await element(by.id('password')).typeText('password');
await element(by.id('login-btn')).tap();
await expect(element(by.id('home'))).toBeVisible();
});
});
快速入门示例
// ProductCard.test.tsx
import { render, screen, fireEvent } from '@testing-library/react-native';
import { ProductCard } from './ProductCard';
const mockProduct = {
id: '1',
title: 'Test Product',
price: 99.99,
};
describe('ProductCard', () => {
it('renders product info', () => {
render(<ProductCard {...mockProduct} onPress={jest.fn()} />);
expect(screen.getByText('Test Product')).toBeOnTheScreen();
expect(screen.getByText('$99.99')).toBeOnTheScreen();
});
it('handles press', () => {
const onPress = jest.fn();
render(<ProductCard {...mockProduct} onPress={onPress} />);
fireEvent.press(screen.getByRole('button'));
expect(onPress).toHaveBeenCalledWith('1');
});
});
常见错误与解决方案
| 错误 | 原因 | 解决方案 |
|---|---|---|
| "Cannot find module" | 缺少模拟 | 添加 jest.mock() |
| 异步超时 | 缺少 await | 使用 waitFor() |
| 未找到元素 | 查询错误 | 检查 testID/role |
验证清单
- 单元测试通过
- 组件测试覆盖交互
- E2E 测试完成完整流程
- 覆盖率达到阈值(80%+)
使用方法
Skill("react-native-testing")
绑定的 Agent:06-react-native-testing
评论
支持 Markdown