Vitest advertises a Jest-compatible API, and it delivers. describe, test, expect, toHaveBeenCalledWith — all identical. Which is why the five things that aren't compatible are so disorienting: the suite mostly runs, and then a handful of files fail for reasons the error messages don't explain.

1. Globals are opt-in

Jest injects describe and expect into the global scope. Vitest doesn't, by default.

// vitest.config.ts

export default defineConfig({