Skip to content

Vitest : File is not defined

Les tests fonctionnent en local mais échouent en CI.


$ vitest run
failed to load config from /workspace/Mindlet/backend/vitest.config.ts
ReferenceError: File is not defined
at .../undici/lib/web/webidl/index.js:533:48

flowchart TD
    A["bun run test"] --> B["vitest run<br/>(shebang: #!/usr/bin/env node)"]
    B --> C["Charge vitest.config.ts"]
    C --> D["Import @cloudflare/vitest-pool-workers"]
    D --> E["Charge undici (dépendance)"]
    E --> F{"Node.js version ?"}
    F -->|"≥ 20"| G["✅ File existe"]
    F -->|"< 20"| H["❌ File undefined → crash"]

Chaîne d’événements :

  1. bun run test exécute le script "test": "vitest run"
  2. Le binaire vitest a un shebang #!/usr/bin/env node → s’exécute sous Node.js
  3. Vitest charge la config qui importe @cloudflare/vitest-pool-workers/config
  4. Cela charge undici (dépendance de wrangler/miniflare)
  5. undici utilise la globale File, disponible depuis Node.js 20
  6. Le runner CI ubuntu-latest a Node.js 18.x → crash

Ajouter Node.js 22 dans le workflow CI :

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "22"
- uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- run: bun install --frozen-lockfile
- run: bun run test

flowchart TD
    A["bun run test"] --> B["vitest run<br/>(Node.js)"]
    B --> C["Charge vitest.config.ts"]
    C --> D["defineWorkersConfig()"]
    C --> E["readD1Migrations()"]
    B --> F["Démarre workerd<br/>(runtime Cloudflare)"]
    F --> G["Bind DB (D1)"]
    F --> H["Bind TEST_MIGRATIONS"]
    B --> I["setupFiles:<br/>test/apply-migrations.ts"]
    I --> J["applyD1Migrations()"]
    B --> K["Exécute les tests<br/>dans workerd"]

ÉlémentRôle
BunPackage manager (bun install, bun.lock)
Node.jsRuntime pour Vitest (via shebang)
workerdRuntime Cloudflare Workers pour les tests
miniflareSimulateur local de l’environnement Workers

Important : Même avec Bun comme package manager, Vitest nécessite Node.js. Les deux doivent être configurés dans le CI.