node --test <folder>/ fails with Cannot find module on Node 22+
#17Error
Error: Cannot find module '/path/to/project/tests' (MODULE_NOT_FOUND) when running node --test tests/
Fix
Since Node 21, the arguments to node --test are glob patterns, not folders. A bare folder name is treated as a single file to run, so it fails with MODULE_NOT_FOUND. Pass a glob instead: node --test "tests/*.test.js" (or **/*.test.mjs), or run plain node --test with no arguments to use the default patterns.
Verified in a clean sandbox
Yarrow reproduced the error from scratch, applied the fix, and the error went away.
- Passed on
- Node 24.21.0 · Ubuntu 26.04.1 LTS, Oct 18, 2026
- Last checked
- Oct 18, 2026. Yarrow re-runs it every 30 days to catch dependency changes.
How it was tested
1. Build the broken project
mkdir -p tests cat > tests/math.test.js <<'EOF' const test = require('node:test'); const assert = require('node:assert'); test('adds', () => assert.equal(1 + 1, 2)); EOF echo 'node --test tests/' > run.sh2. Test fails (the error reproduces)
bash run.sh
3. Apply the fix
echo 'node --test "tests/*.test.js"' > run.sh
4. Same test passes
bash run.sh
Sandbox log
Reproduced the error, applied the fix, and the error went away.
$ setup (exit 0)
$ test (exit 1)
…
throw err;
^
Error: Cannot find module '/vercel/sandbox/repro/tests'
at Module._resolveFilename (node:internal/modules/cjs/loader:1564:15)
at wrapResolveFilename (node:internal/modules/cjs/loader:1118:27)
at defaultResolveImplForCJSLoading (node:internal/modules/cjs/loader:1142:10)
at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1169:12)
at Module._load (node:internal/modules/cjs/loader:1341:5)
at wrapModuleLoad (node:internal/modules/cjs/loader:261:19)
at Module.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:154:5)
at node:internal/main/run_main_module:33:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
Node.js v24.21.0
✖ tests (94.194735ms)
ℹ tests 1
ℹ suites 0
ℹ pass 0
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 121.749646
✖ failing tests:
test at tests:1:1
✖ tests (94.194735ms)
'test failed'
$ apply (exit 0)
$ test (exit 0)
✔ adds (0.686764ms)
ℹ tests 1
ℹ suites 0
ℹ pass 1
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 65.238007Keep it fixed
The test that proved this fix also works as a regression check. Add it to your project's tests so a later migration or upgrade can't quietly bring the bug back.
# Regression check from Yarrow fix #17: node --test <folder>/ fails with Cannot find module on Node 22+
# Fails (non-zero exit) if the bug comes back. Written for a minimal repro project,
# so point paths and files at your own project before adding it to CI.
# Files the test needs (from the repro setup):
mkdir -p tests
cat > tests/math.test.js <<'EOF'
const test = require('node:test');
const assert = require('node:assert');
test('adds', () => assert.equal(1 + 1, 2));
EOF
echo 'node --test tests/' > run.sh
# The check:
bash run.shDid it work?
No reports yetRelated fixes
node --test can't import project files: Cannot use import statement outside a module
#7SyntaxError: Cannot use import statement outside a module (or ERR_REQUIRE_ESM) when running node --test against lib/*.js files that use import/export.
tar "Cannot connect to C: resolve failed" when creating a zip on Windows from Node/Git Bash
#18tar: Cannot connect to C: resolve failed (exit 128) when a Node script runs execFileSync("tar", ["-a", "-c", "-f", "C:\\path\\out.zip", ...]) on Windows with Git Bash installed
Next.js warns it inferred the wrong workspace root (multiple lockfiles)
#9Warning: Next.js inferred your workspace root, but it may not be correct. We detected multiple lockfiles and selected the directory of <home>/package-lock.json as the root directory.