Skip to main content

معلومات المصدر

المستودع
gitkraken/vscode-gitlens
آخر نشاط في المصدر
٣ سبتمبر ٢٠٢٦ في ١٥:٣٩
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٩٬٩٣٦
التفرعات
١٬٨٠١

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
add-test
description
Generate unit or E2E test files for existing code
# /add-test - Generate Tests ## Usage ``` /add-test [type] [target] ``` - `type` — `unit` (default) or `e2e` - `target` — File path or feature name to test ## Unit Test Template Creates `src/path/__tests__/file.test.ts`: ```typescript import * as assert from 'assert'; import { functionToTest } from '../file.js'; suite('FeatureName Test Suite', () => { suite('functionName', () => { test('should handle normal input', () => { const result = functionToTest('input'); assert.strictEqual(result, 'expected'); }); test('should handle edge case', () => { const result = functionToTest(''); assert.strictEqual(result, undefined); }); test('should throw on invalid input', () => { assert.throws(() => functionToTest(null), /error message/); }); }); suite('async function', () => { test('should resolve with data', async () => { const result = await asyncFunction(); assert.deepStrictEqual(result, { key: 'value' }); }); }); }); ``` When mocking is needed, use `sinon`: ```typescript import * as sinon from 'sinon'; let sandbox: sinon.SinonSandbox; setup(() => { sandbox = sinon.createSandbox(); }); teardown(() => { sandbox.restore(); }); ``` ## E2E Test Template Creates `tests/e2e/specs/feature.test.ts`: ```typescript import { test as base, createTmpDir, expect, GitFixture, MaxTimeout } from '../baseTest.js'; const test = base.extend({ vscodeOptions: [ { vscodeVersion: process.env.VSCODE_VERSION ?? 'stable', setup: async () => { const repoDir = await createTmpDir(); const git = new GitFixture(repoDir); await git.init(); await git.commit('Initial commit', 'README.md', '# Test'); return repoDir; }, }, { scope: 'worker' }, ], }); test.describe('Feature Name', () => { test.describe.configure({ mode: 'serial' }); test.afterEach(async ({ vscode }) => { await vscode.gitlens.resetUI(); }); test('should display feature correctly', async ({ vscode }) => { await vscode.gitlens.openGitLensSidebar(); await expect(vscode.page.getByRole('heading')).toContainText('Expected'); }); }); ``` ## Instructions ### Unit Tests 1. Read target file to understand exports 2. Create `__tests__/` directory if needed 3. Cover: normal paths, edge cases (empty/null/undefined), error conditions, async operations 4. Assertions: `assert.strictEqual()`, `assert.deepStrictEqual()`, `assert.ok()`, `assert.throws()` ### E2E Tests **Use the MCP server to explore, then write the test.** Don't guess at selectors — verify them live. 1. **Explore with MCP first** — Use `/live-inspect` to launch VS Code and discover the right selectors: ``` launch {} execute_command { command: "gitlens.showGraphView" } aria_snapshot {} # See all UI elements and roles inspect_dom { selector: "h1", in_webview: true } # Find webview content screenshot {} # Visual verification ``` 2. **Determine Git state needed** — what commits, branches, tags does the test need? 3. **Create GitFixture setup** — use the methods below 4. **Write the test** using selectors discovered via MCP 5. **Validate with MCP** — run the test scenario manually through MCP tools to confirm assertions before finalizing: - Use `inspect_dom` to verify element text/visibility - Use `evaluate` to check extension runtime state - Use `screenshot` to visually confirm UI state 6. Cover: UI presence, user interactions, navigation, error states, Pro vs Community gating 7. Assertions: `expect(locator).toBeVisible()`, `.toContainText()`, `.toHaveCount()` ### E2E Webview Content Use `getGitLensWebview(title, purpose)` to get a `FrameLocator` for webview content: ```typescript const webview = await vscode.gitlens.getGitLensWebview('Graph', 'webviewView'); await expect(webview!.locator('h1')).toContainText('Expected heading'); await expect(webview!.getByRole('button', { name: /Try Pro/i })).toBeVisible(); ``` Available webviews: `Graph`, `Graph Details`, `Inspect`, `Visual File History`, `Interactive Rebase`. Purpose is `webviewView` (sidebar/panel) or `webviewPanel` (editor tab) or `customEditor`. ### E2E Pro Feature Gating ```typescript // Simulate Pro subscription for the test using _ = await vscode.gitlens.startSubscriptionSimulation({ state: 6 /* SubscriptionState.Paid */, planId: 'pro', }); // Pro features now accessible — auto-reverts when scope exits ``` ## GitFixture Methods ```typescript await git.init() await git.commit(message, fileName, content) await git.branch(name) await git.checkout(name, create?) await git.tag(name, { message?, ref? }) await git.stash(message?) await git.worktree(path, branch) await git.addRemote(name, url) await git.merge(branch, message?) ``` ## Running Tests ```bash pnpm run test -- --grep "FeatureName" # Unit pnpm run test:e2e -- tests/e2e/specs/file.test.ts # E2E ``` For detailed test running patterns, output interpretation, and debugging: see `docs/testing.md`.
عرض على GitHub