できない.dev

Vitest で「describe is not defined」が解決できない(globals 未設定)

Vitest は既定で describe / it / expect をグローバルに公開しない。
test.globals を true にするか、各ファイルで vitest から読み込めば describe is not defined を解消できる。

公開: 更新:

実行例あり(2026-09-03 に実環境で検証)

要約

describe is not defined(it / expect でも同様)は、Vitest が既定でテスト API をグローバルへ公開しないために出る。

Vitest は明示性を重視して、既定では describe などを各ファイルで読み込ませる方針になっている。

設定で globals: true にするか、各ファイルで vitest から読み込めば解消する(公式: globals(新しいタブで開く))。

実行例

describe を読み込まず globals も未設定のまま実行すると、スイートの収集段階で ReferenceError: describe is not defined になりテストが 1 件も走らない。vitest.config.js で globals: true にした場合と、テストから vitest の describe / it / expect を読み込んだ場合はどちらも 1 件が通る。

$ npx vitest run
RUN  v2.1.9 /tmp/tmp.R9XExt6cEv
 
 ❯ sum.test.js (0 test)
 
⎯⎯⎯⎯⎯⎯ Failed Suites 1 ⎯⎯⎯⎯⎯⎯⎯
 
 FAIL  sum.test.js [ sum.test.js ]
ReferenceError: describe is not defined
 ❯ sum.test.js:3:1
      1| import { sum } from './sum.js';
      2| 
      3| describe('sum', () => {
       | ^
      4|   it('adds', () => {
      5|     expect(sum(1, 2)).toBe(3);
 
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
 
 Test Files  1 failed (1)
      Tests  no tests
   Start at  02:14:47
   Duration  208ms (transform 21ms, setup 0ms, collect 0ms, tests 0ms, environment 0ms, prepare 48ms)
$ echo $?
1
$ npx vitest run
The CJS build of Vite's Node API is deprecated. See https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.
 
 RUN  v2.1.9 /tmp/tmp.R9XExt6cEv
 
 ✓ sum.test.js (1 test) 1ms
 
 Test Files  1 passed (1)
      Tests  1 passed (1)
   Start at  02:14:47
   Duration  179ms (transform 16ms, setup 0ms, collect 8ms, tests 1ms, environment 0ms, prepare 43ms)
$ echo $?
0
$ npx vitest run
RUN  v2.1.9 /tmp/tmp.R9XExt6cEv
 
 ✓ sum.test.js (1 test) 1ms
 
 Test Files  1 passed (1)
      Tests  1 passed (1)
   Start at  02:14:48
   Duration  190ms (transform 14ms, setup 0ms, collect 9ms, tests 1ms, environment 0ms, prepare 41ms)
$ echo $?
0

— 2026-09-03 時点の出力

検証環境

検証日
実行環境
node:20Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. Vitest は既定で global API を提供しない。
  2. Jest から移行し、テスト関数を読み込まずに使っている。
  3. globals: true にしたが、TypeScript の型設定が無く型エラーになる。

型エラー(Cannot find name 'describe' など)と実行時エラー(ReferenceError)は別物で、前者は tsconfig の types 設定、後者は globals の有効化または読み込み不足が原因になりやすい。

どちらの症状かを先に切り分けると、設定すべき箇所が一意に決まる。

解決策

1. config で globals を有効化する

import { defineConfig } from 'vitest/config';
 
export default defineConfig({
  test: { globals: true },
});

2. 各テストで読み込む

import { describe, it, expect } from 'vitest';

globals を使わない方針なら、ファイルごとに明示的に読み込む。

3. TypeScript の型を通す

{
  "compilerOptions": {
    "types": ["vitest/globals"]
  }
}

この記事は役立ちましたか?