On this page
Migrating from Jest
Most Jest suites translate to deno test without rewriting test logic: the
node:test module provides the same describe/it structure, and the standard
library ships an expect with the matchers you already use. What changes is a
handful of imports and how the runner is configured.
The same test, in Deno Jump to heading
A typical Jest test needs only new imports:
import { beforeEach, describe, it } from "node:test";
import { expect, fn } from "jsr:@std/expect";
describe("shopping cart", () => {
let cart: string[];
beforeEach(() => {
cart = [];
});
it("starts empty", () => {
expect(cart).toHaveLength(0);
});
it("notifies a listener", () => {
const onAdd = fn();
cart.push("apple");
onAdd(cart.length);
expect(onAdd).toHaveBeenCalledWith(1);
});
});
$ deno test cart.test.ts
ok | 1 passed (2 steps) | 0 failed (13ms)
Unlike Jest, nothing is injected as a global: describe, it, expect, and
the hooks are explicit imports, so each file states what it uses. Tests written
against node:test also keep working in Node.js itself.
What maps to what Jump to heading
| Jest | Deno |
|---|---|
describe, it, beforeEach, … |
node:test (or @std/testing/bdd) |
expect(...) matchers |
jsr:@std/expect |
jest.fn() |
fn() from jsr:@std/expect |
jest.spyOn(obj, "m") |
spy/stub from @std/testing/mock |
toMatchSnapshot() |
assertSnapshot |
jest.useFakeTimers() |
FakeTime |
npx jest |
deno test |
npx jest --watch |
deno test --watch |
npx jest -t "name" |
deno test --filter "name" |
Translate the configuration Jump to heading
Jest configuration mostly disappears: TypeScript, JSX, and ES modules work
without transforms, so ts-jest, babel-jest, and transform entries have no
equivalent to migrate. File selection moves into deno.json:
{
"test": {
"include": ["src/**/*.test.ts"],
"exclude": ["src/fixtures/"]
}
}
Module mocks Jump to heading
There is no equivalent of jest.mock("./module"), because module records are
immutable in Deno. Tests that rely on it migrate to one of:
- dependency injection: pass the collaborator in, and hand the test a spy or stub,
- stubbing the object the module exposes, with
stubfrom@std/testing/mock.
This is usually the only part of a migration that requires touching the code under test.
Keep npm packages where it helps Jump to heading
Test helpers from npm keep working through npm: specifiers, for example
npm:@testing-library/dom for DOM assertions (see
Use Testing Library with Deno). The test
runner itself is the part you migrate.
For runner flags, reporters, and coverage, see the
deno test reference.
Last updated on