
Write Tests
- 14 installs
- 33.3k repo stars
- Updated August 5, 2026
- remix-run/remix
Helps with testing & qa tasks during AI-assisted development.
About
write-tests is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted coding.
- write-tests
- Testing & QA
- AI-coding skill
Write Tests by the numbers
- 14 all-time installs (skills.sh)
- +1 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,494 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/remix-run/remix --skill write-testsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 14 |
|---|---|
| repo stars | ★ 33.3k |
| Last updated | August 5, 2026 |
| Repository | remix-run/remix ↗ |
What it does
Helps with testing & qa tasks during AI-assisted development.
Files
Write Tests
Overview
Write tests that prove behavior with the smallest useful fixture surface. Use Remix's own test/assert packages and describe/it style by default, keep package dependency graphs clean, and validate with the narrowest reliable commands.
Workflow
1. Read the nearest package.json, tsconfig.json, and existing sibling tests before choosing a runner or fixture style. 2. Identify whether the package can depend on @remix-run/test, or whether it is a dependency of @remix-run/test and must avoid a circular dependency. 3. Keep the test close to the behavior owner. Prefer local helpers and direct Web/Node primitives over importing higher-level workspace packages as fixtures. 4. Put test-only workspace packages in devDependencies with workspace:^; do not add them to runtime dependencies. 5. Run the package test and typecheck commands. Refresh pnpm-lock.yaml when package metadata changes.
Runner Choice
- Write new and changed tests in
describe/itstyle. When touching a file that uses top-leveltest(), convert the affected tests todescribe/itand leave unrelated tests alone. - Use
@remix-run/testand@remix-run/assertby default for package tests. - Use
node:testandnode:assert/strictonly when testing a package that is a dependency of@remix-run/test, or when adding Remix test/assert as a dependency would create a circular dependency. - Do not keep a
test:bunscript fornode:testpackages unless it has been validated. Bun's test runner does not automatically discover tests written withnode:testimports.
Node test package script:
"test": "node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'"Node test imports:
import * as assert from 'node:assert/strict'
import { describe, it } from 'node:test'Remix test package script:
"test": "remix-test"Remix test imports:
import * as assert from '@remix-run/assert'
import { describe, it } from '@remix-run/test'Test Structure
- Name
describe()blocks after the public API or behavior owner, and nameit()tests by observable behavior. - Do not generate tests inside
describe()with loops or conditionals; this breaks per-test IDE execution. - Prefer a few explicit cases over dense table tests when the cases document distinct behavior.
- Keep async tests awaited all the way through. Avoid resolving promises before the behavior under test has completed.
- Use mocks sparingly and locally. Prefer the Remix test context mocks when using
@remix-run/test; usemock.method()/mock.fn()fromnode:testonly in node-runner exception packages.
Fixtures
- Keep fixtures minimal and local to the test file unless they are reused across multiple files for the same behavior surface.
- Avoid importing higher-level workspace packages just to build a fixture. For example, a fetch-handler test can branch on
new URL(request.url).pathnameinstead of depending on@remix-run/fetch-router. - Prefer Web APIs and standards-aligned primitives when they express the fixture clearly.
- For e2e tests, serve the smallest app or handler that exercises the user-observable behavior under test.
Assertions
- Use
@remix-run/assertby default. - Use
node:assert/strictonly in node-runner exception packages that cannot depend on@remix-run/assert/@remix-run/test. - Assert public behavior and observable side effects. Avoid asserting private implementation structure unless the package's public contract is the structure.
- For error tests, assert the error shape/message that consumers can rely on.
Dependency Hygiene
- Runtime code imports belong in
dependencies. - Test files, fixtures, and runner-only imports belong in
devDependencies. - Use
workspace:^for workspace package dependencies unless the repo has an established reason forworkspace:*. - After changing package dependencies or scripts, run
pnpm i --lockfile-only --ignore-scriptsand then a frozen install check. - Reassess workspace cycles when changing testing infrastructure:
pnpm i --frozen-lockfile --ignore-scriptsshould not emit cyclic workspace dependency warnings.
Validation
Use the narrowest meaningful commands:
pnpm --filter @remix-run/<package> run test
pnpm --filter @remix-run/<package> run typecheck
pnpm i --frozen-lockfile --ignore-scriptsFor cross-package or shared test infrastructure changes, also consider:
pnpm run test:changed
pnpm run typecheck:changed
pnpm run lintinterface:
display_name: 'Write Tests'
short_description: 'Write focused, dependency-conscious tests for Remix packages.'
default_prompt: "Use the write-tests skill to add or update tests for this Remix package while following the repo's runner, fixture, assertion, and validation conventions."