ts-testing
Build pragmatic test suites for TypeScript apps. Automatically detects existing test frameworks and enforces coverage best practices.
Install
mkdir -p .claude/skills/ts-testing && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/393" && unzip -o skill.zip -d .claude/skills/ts-testing && rm skill.zipInstalls to .claude/skills/ts-testing
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Design, implement, and maintain high‑value TypeScript test suites using popular JS/TS testing libraries. Use this skill whenever the user is adding tests, debugging failing tests, or refactoring code that should be covered by tests.Key capabilities
- →Detect existing test frameworks in project configuration
- →Generate unit, integration, and end-to-end tests
- →Implement regression tests for reported bugs
- →Apply behavioral testing principles
- →Manage mocks and spies for external dependencies
How it works
It inspects the project configuration to identify the testing stack and then generates tests that follow the existing naming and structural patterns.
Inputs & outputs
When to use ts-testing
- →Add integration tests for a new feature
- →Write regression tests for a bug
- →Refactor tests for better maintainability
About this skill
This skill guides you to build pragmatic, maintainable test suites for TypeScript code. Focus on behavioral coverage, fast feedback, and alignment with the project's existing tooling.
The user is a TypeScript‑focused developer. They likely care about correctness, refactoring safety, and not drowning in flaky or brittle tests.
When to use this skill
Use this skill when:
- The user is adding or updating unit, integration, or end‑to‑end tests
- The user reports a bug and wants a regression test
- The user is refactoring and wants confidence they didn’t break behavior
- The repo has test tooling configured (or clearly needs one) and you’re asked to “add tests” or “improve tests”
Do not invent a new test stack if the repo already has one. First detect and follow the existing setup.
Library preferences
Always align with the repo first (check package.json, devDependencies, config files):
- If the repo already uses a framework (Jest, Vitest, Playwright, Cypress, etc.), stick with it.
- Only suggest new libraries if there is no obvious testing stack yet.
When you must choose, prefer:
- Unit / integration tests
- Node / backend / shared libraries:
- Prefer Vitest (
vitest) or Jest (jest) - If
vitestis present, use it. Else ifjestis present, use that.
- Prefer Vitest (
- Node / backend / shared libraries:
- React / UI component tests
- Use Testing Library with the existing runner:
@testing-library/reactwith Vitest or Jest
- Use Testing Library with the existing runner:
- End‑to‑end browser tests
- Prefer Playwright if installed or if starting from scratch
- Use Cypress if the repo already uses it or the user asks for it explicitly
If the repo uses a less common stack (Mocha, Ava, Node’s built‑in test runner), respect that choice and adapt.
Core testing philosophy
Follow these principles:
- Test behavior, not implementation details
- For React/UI: test what the user sees and does (DOM, events, ARIA), not internal state or private methods
- For services: test public APIs, not private helpers
- Keep tests fast and focused
- Prefer small, deterministic tests that run quickly
- Avoid unnecessary network, filesystem, or database calls unless you are explicitly writing integration tests
- Make failures obvious
- Clear naming and assertions that explain why a test failed
- Use descriptive test names following “given/when/then” style where helpful
- Minimize mocking, but use it where it makes sense
- Mock external services, network calls, and slow dependencies
- Avoid mocking your own business logic unless there’s a strong reason
Standard workflow
When asked to add or improve tests, follow this workflow:
-
Detect the existing stack
- Inspect
package.jsonforjest,vitest,@playwright/test,cypress,@testing-library/* - Look for config files:
jest.config.*,vitest.config.*,playwright.config.*,cypress.config.* - Check
test,unit, ore2escripts inpackage.json
- Inspect
-
Locate the right place for the test
- Mirror existing patterns:
- If tests live in
__tests__directories, follow that - If they use
*.test.tsor*.spec.ts, do the same
- If tests live in
- For UI: place tests near the component (e.g.
Component.test.tsx) if that’s the existing convention
- Mirror existing patterns:
-
Write the test in a TS‑friendly way
- Use
.test.ts/.test.tsx(or.spec) as per repo convention - Avoid
anyin tests when possible; use real types or minimal interfaces to keep tests robust - For async code: use
awaitwith async test functions, avoid dangling promises
- Use
-
Follow library‑specific best practices
Vitest / Jest
- Use
describe/itortestwith clear names - Prefer
vi.fn()/jest.fn()for spies and mocks - For modules: use
vi.mock()/jest.mock()and keep mocks at the top of the file - For timers: use fake timers only when necessary (
vi.useFakeTimers()/jest.useFakeTimers())
React Testing Library
- Use
render,screen, and user interactions (userEvent) - Query by role, label, text as a user would (prefer
getByRole,getByLabelText) - Avoid querying by test IDs unless there’s no good semantic alternative
Playwright / Cypress
- Use existing fixtures and helpers (e.g. authenticated sessions, base URL) instead of re‑inventing them
- Keep tests independent; don’t rely on order
- Use
data-testidor semantics consistently as locators
- Use
-
Add regression tests for reported bugs
- Reproduce the bug in a failing test first
- Only then change the implementation to make the test pass
- Name regression tests clearly (e.g.
it("does not crash when X is null (regression #123)"))
-
Running tests
- Use existing scripts, e.g.
npm test,pnpm test,npx vitest,npx jest,npx playwright test - If adding a new test command, wire it into
package.jsonscripts following existing style
- Use existing scripts, e.g.
Patterns to prefer
- One behavior per test: Don’t cram multiple unrelated assertions into a single test unless they’re part of the same scenario.
- Helper factories: Use small factory functions for building test data (
makeUser,makeOrder) instead of duplicating setup. - Explicit async handling: Always
awaitpromises; avoid passing async callbacks to APIs that don’t expect them.
Anti‑patterns to avoid
- Overuse of snapshots for complex objects or DOM – use targeted assertions instead
- Testing private methods directly
- Heavy mocking that makes tests mirror implementation wiring
- Flaky tests that depend on real time, network, or global state without control
TypeScript‑specific guidance
- Use the project’s
tsconfigfor tests when possible (tsconfig.test.jsonif present) - Avoid silencing type errors just to “get tests compiling”
- When stubbing data, create minimal typed helpers rather than using
as any
If the user asks you to generate tests, prefer fewer, high‑value tests that mirror real usage over large, mechanical test suites.
When not to use it
- →When the repository lacks any existing test infrastructure and you are not asked to set one up
- →When the task involves non-TypeScript codebases
Prerequisites
Limitations
- →Cannot invent new test stacks if the repository already has a defined one
- →Requires existing project configuration to provide accurate suggestions
How it compares
It prioritizes existing project tooling and behavioral coverage over generic, one-size-fits-all testing approaches.
Compared to similar skills
ts-testing side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| ts-testing (this skill) | 6 | 8mo | No flags | Intermediate |
| dependency-upgrade | 26 | 5mo | Review | Intermediate |
| validate-typescript | 5 | 9mo | Review | Beginner |
| react-best-practices | 22 | 3mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
dependency-upgrade
wshobson
Manage major dependency version upgrades with compatibility analysis, staged rollout, and comprehensive testing. Use when upgrading framework versions, updating major dependencies, or managing breaking changes in libraries.
validate-typescript
BerryKuipers
Run TypeScript compiler type-checking (tsc --noEmit) to validate type safety and catch type errors. Works with any TypeScript project. Returns structured output with error counts, categories (type/syntax/import errors), and affected files. Used for quality gates and pre-commit validation.
react-best-practices
redpanda-data
Client-side React performance optimization patterns.
feature-flags
Use when feature flag tests fail, flags need updating, understanding @gate pragmas, debugging channel-specific test failures, or adding new flags to React.
typescript-code-review
anyproto
Perform comprehensive code reviews for TypeScript projects, analyzing type safety, best practices, performance, security, and code quality with actionable feedback
senior-qa
alirezarezvani
This skill should be used when the user asks to "generate tests", "write unit tests", "analyze test coverage", "scaffold E2E tests", "set up Playwright", "configure Jest", "implement testing patterns", or "improve test quality". Use for React/Next.js testing with Jest, React Testing Library, and Playwright.