write-unit-tests

von tldraw

Schreibt Unit- und Integrationstests für das tldraw SDK. Verwenden Sie dies beim Erstellen neuer Tests, Hinzufügen von Testabdeckung oder Beheben fehlgeschlagener Tests in packages/editor oder…

npx skills add https://github.com/tldraw/tldraw --skill write-unit-tests

Writing tests

Unit and integration tests use Vitest and run from workspace directories, not the repo root.

Read a neighboring test before writing a new one — the existing suites are the specification for how we test, and they stay current in a way prose can't. Good starting points:

  • packages/tldraw/src/test/SelectTool.test.ts — tool state machine assertions
  • packages/tldraw/src/test/resizing.test.ts — pointer-driven interaction with handles
  • packages/tldraw/src/lib/shapes/arrow/ArrowShapeUtil.test.ts — shape util plus bindings
  • packages/editor/src/lib/editor/managers/ClickManager/ClickManager.test.ts — a UI-free manager
  • packages/editor/src/lib/primitives/Vec.test.ts — a plain primitive

For the available TestEditor methods, read the class itself rather than a list here: packages/tldraw/src/test/TestEditor.ts.

Which workspace

  • packages/editor — core primitives, geometry, managers, base editor behavior that must not depend on default shapes or UI.
  • packages/tldraw — anything needing default shapes or tools, which is most integration tests.

Each package has its own TestEditor, and they are not interchangeable: packages/editor/src/lib/test/TestEditor.ts has no default shapes or tools, packages/tldraw/src/test/TestEditor.ts wires up the full SDK. Import from the package you're testing in.

cd packages/tldraw && yarn test run
cd packages/tldraw && yarn test run --grep "SelectTool"
cd packages/tldraw && yarn test          # watch mode

Placement

Unit tests sit next to the file they cover (Vec.tsVec.test.ts). Cross-cutting integration tests live in packages/tldraw/src/test/. Shape and tool tests sit with the implementation, not in src/test/.

Gotchas

These are the things reading an existing test won't tell you.

Wheel and pinch events are batched. dispatch() alone won't apply them — emit a tick to flush:

editor.dispatch(wheelEvent)
editor.emit('tick', 16)

See packages/editor/src/lib/editor/Editor.test.ts for the full pattern.

toCloselyMatchObject is ours, not Vitest's. Use it instead of toMatchObject whenever floating-point geometry is involved, or tests fail on rounding noise. It takes an optional roundToNearest. Defined in packages/tldraw/src/test/TestEditor.ts.

Animation-dependent code needs the rAF stub. vi.useFakeTimers() alone isn't enough, because requestAnimationFrame isn't driven by the fake clock. Tests that animate replace it at module scope — see the top of packages/tldraw/src/lib/shapes/arrow/ArrowShapeUtil.test.ts.

Dispose the editor in afterEach. editor?.dispose() releases the reactive subscriptions and timers the editor holds; without it they leak across tests in the same file. Suites that build up shapes also tend to clear them in beforeEach so each test starts from a known page.

Always mockRestore() a vi.spyOn on the editor. Editor instances outlive individual assertions within a suite, so an unrestored spy silently changes later tests.

Conventions

  • Use createShapeId() for shape IDs so they're stable and typed.
  • Prefer comparing whole objects over field-by-field assertions when it gives a clearer failure.
  • Use editor.expectToBeIn('select.idle') for state machine assertions rather than reaching into internals.
  • @ts-expect-error is the way to assert that invalid props are rejected at the type level.

Mehr Skills von tldraw

review-docs
tldraw
Dokumentation überprüfen und verbessern mit paralleler Bewertung und iterativem Verbesserungszyklus.
official
clean-copy
tldraw
Erstelle den aktuellen Branch auf einem neuen Branch mit einer sauberen, erzählerisch hochwertigen Git-Commit-Historie neu. Verwende, wenn du aufgefordert wirst, einen sauberen Kopie-Branch zu erstellen, Commits zu bereinigen …
official
commit-changes
tldraw
Erstelle einen Git-Commit für die aktuellen Änderungen. Verwende, wenn aufgefordert, Änderungen zu committen, einen Commit zu erstellen, eine Commit-Nachricht zu generieren oder den aktuellen Arbeitsbaum mit… zu committen.
official
dotcom-release-crew
tldraw
Post to the
official
dotcom-release-marketing
tldraw
Veröffentliche eine Zusammenfassung in einfacher Sprache darüber, was in dieser Woche in der tldraw.com (dotcom)-Version erscheint, im Discord-Kanal des Marketing-Teams. Verwende dies bei der Vorbereitung der…
official
issue
tldraw
Erstelle und recherchiere ein GitHub-Issue im tldraw-Repository basierend auf einer Benutzerbeschreibung. Verwende, wenn der Benutzer Issue aufruft, darum bittet, ein Issue zu erstellen, einen Fehler zu melden,…
official
pr
tldraw
Erstelle oder aktualisiere einen Pull-Request für den aktuellen Branch im tldraw-Repository. Verwende, wenn der Benutzer pr aufruft, darum bittet, einen PR zu erstellen, einen bestehenden PR zu aktualisieren, zu pushen…
official
pr-walkthrough
tldraw
Erstelle eine kommentierte Video-Durchlauf eines Pull Requests mit Code-Folien und Audio-Kommentar. Verwende, wenn du aufgefordert wirst, einen PR-Durchlauf, ein PR-Video oder einen Durchlauf zu erstellen…
official