用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/JohnNuwan/EVA_CORE --skill jest命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | jest |
| description | Tester du code JavaScript/TypeScript avec Jest — unit tests, mocks, snapshots, coverage, async, et intégration CI. |
| version | 1.0.0 |
| author | EVA |
| license | MIT |
| metadata | {"hermes":{"tags":["jest","javascript","typescript","testing","unit-test","nodejs","coverage"],"related_skills":["cypress","playwright","test-driven-development"]}} |
Jest est le framework de test le plus répandu pour JavaScript/TypeScript. Zero-config pour les projets React/Vue/Node, assertions intégrées, mocking puissant, snapshots, couverture de code, et mode watch.
# Installation
npm install --save-dev jest @types/jest ts-jest
# Avec create-react-app / next / vue-cli : déjà inclus
npx jest --init
Configuration jest.config.js :
module.exports = {
testEnvironment: 'node', // ou 'jsdom' pour React
roots: ['<rootDir>/src'],
testMatch: ['**/__tests__/**/*.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)'],
collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}', '!src/**/*.d.ts'],
coverageThreshold: {
global: { branches: 80, functions: 80, lines: 80, statements: 80 },
},
transform: {
'^.+\\.tsx?$': 'ts-jest',
},
};
Avec package.json :
{
"scripts": {
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"test:ci": "jest --ci --coverage --maxWorkers=2"
}
}
src/
├── utils/
│ ├── formatage.ts
│ └── __tests__/
│ └── formatage.test.ts
├── services/
│ ├── api.ts
│ └── __tests__/
│ └── api.test.ts
└── components/
├── Bouton.tsx
└── __tests__/
└── Bouton.test.tsx
import { formaterDate, calculerTVA } from '../utils/formatage';
test('formaterDate retourne JJ/MM/AAAA', () => {
expect(formaterDate(new Date(2024, 0, 15))).toBe('15/01/2024');
});
test('calculerTVA applique 20%', () => {
expect(calculerTVA(100)).toBe(20);
expect(calculerTVA(0)).toBe(0);
expect(calculerTVA(-50)).toBe(-10);
});
test('comparaison objets', () => {
expect({ a: 1, b: 2 }).toEqual({ a: 1, b: 2 });
expect([1, 2, 3]).toContain(2);
expect().();
});
(, {
( + ).(, );
});
// Callback
test('données chargées', (done) => {
chargerDonnees((data) => {
expect(data).toBeDefined();
done();
});
});
// Promise
test('fetch utilisateur', async () => {
const user = await fetchUtilisateur(1);
expect(user.nom).toBe('Alice');
});
// Reject
test('erreur serveur', async () => {
await expect(fetchUtilisateur(999)).rejects.toThrow('Not found');
});
import axios from 'axios';
import { fetchUtilisateur } from './api';
jest.mock('axios');
test('fetchUtilisateur retourne les données', async () => {
const mockData = { id: 1, nom: 'Alice' };
(axios.get as jest.Mock).mockResolvedValue({ data: mockData });
const result = await fetchUtilisateur(1);
expect(result).toEqual(mockData);
expect(axios.get).toHaveBeenCalledWith('/api/users/1');
});
test('fetchUtilisateur gère l\'erreur réseau', async () => {
(axios.get as jest.Mock).mockRejectedValue(new Error('Network error'));
await expect(fetchUtilisateur(1)).rejects.toThrow('Network error');
});
test('callback appelé avec les bons args', () => {
const mockFn = jest.fn();
executer(mockFn);
expect(mockFn).toHaveBeenCalledTimes(1);
expect(mockFn).toHaveBeenCalledWith('donnée', expect.any(Number));
});
jest.useFakeTimers();
test('setTimeout déclenché après 5s', () => {
const callback = jest.fn();
planifierRappel(callback, 5000);
expect(callback).not.toHaveBeenCalled();
jest.advanceTimersByTime(5000);
expect(callback).toHaveBeenCalledTimes(1);
});
fetch globalglobal.fetch = jest.fn();
beforeEach(() => {
(global.fetch as jest.Mock).mockClear();
});
test('fetchUser utilise fetch', async () => {
(global.fetch as jest.Mock).mockResolvedValueOnce({
ok: true,
json: async () => ({ id: 1, name: 'Alice' }),
});
const user = await fetchUser(1);
expect(user.name).toBe('Alice');
});
import { render } from '@testing-library/react';
import Bouton from '../Bouton';
test('Bouton rendu correctement', () => {
const { container } = render(<Bouton label="Cliquez-moi" variant="primary" />);
expect(container.firstChild).toMatchSnapshot();
});
// Mettre à jour : jest --updateSnapshot
Fichier .github/workflows/test.yml :
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npm test -- --ci --coverage --maxWorkers=2
Scripts utiles :
npm test # Tous les tests
npx jest --watch # Mode watch
npx jest --coverage # Rapport de couverture
npx jest --verbose # Mode verbeux
npx jest --testPathPattern="utils" # Filtrer par chemin
npx jest -t "formaterDate" # Filtrer par nom de test
npx jest --onlyChanged # Tests sur fichiers modifiés
expect.hasAssertions() ou --verbose pour vérifierjest.clearAllMocks() dans beforeEachawait ou done()document n'existe pas, utiliser testEnvironment: 'jsdom'npm test passe avec 0 erreurs, 0 warningsasync/await ou done()--updateSnapshot