Visual Studio 2022 で Node.js の Web アプリを作ったのに、単体テストだけがうまく回らない……というのはよくあるつまずきです。NuGet+Chutzpah にこだわらず、npm で Jest などを導入し、Visual Studio のテストエクスプローラー(Test Explorer)から実行できる形に整える手順を、プロジェクト形式の違いも含めて具体的に解説します。
症状:NuGet で Jasmine を入れようとして「Project ‘Default’ is not found」になる理由
まず結論から言うと、Node.js の依存関係(テストフレームワーク含む)は NuGet ではなく npm で管理するのが基本です。Visual Studio の「Blank Node.js web application」テンプレートで作ったプロジェクトでは、NuGet の Package Manager Console で Default project が選べず、次のようなエラーになりがちです。
Install-Package Jasmine
Install-Package : Project 'Default' is not found.
この現象は「あなたの環境が壊れている」のではなく、Node.js プロジェクト(特に旧式の .njsproj)と NuGet の前提が噛み合っていないことが原因です。実際、同様の状況から「Visual Studio 上で単体テストはどうすればいいのか?」という質問が Microsoft Q&A にも投稿されています。
加えて、ネット上には「Chutzpah(テストランナー)+ Jasmine(テストフレームワーク)を NuGet で入れる」系の記事が今も残っていますが、これは主に .NET プロジェクトに JavaScript を混ぜていた時代の流れであり、現代の Node.js 開発の“標準”とはズレやすいです(もちろん特殊な事情で必要になるケースはあります)。
| 観点 | NuGet | npm | Node.js アプリでの推奨 |
|---|---|---|---|
| 主な対象 | .NET ライブラリ | Node.js / JavaScript パッケージ | npm を基本 |
| インストール先 | csproj 等に紐づく | package.json(dependencies / devDependencies) | package.json に集約 |
| テスト系の文化 | MSTest / xUnit など | Jest / Mocha / Jasmine / Vitest など | npm のテスト文化に寄せる |
結論:Visual Studio でも Node.js の単体テストは実行できる
Visual Studio 2022 には、JavaScript/TypeScript の単体テストを Test Explorer から検出・実行する仕組みがあります。対応しているテストフレームワークは Mocha / Jasmine / Tape / Jest / Vitest などです。
さらに、Visual Studio の Node.js ツール自体も「コマンドプロンプトに切り替えずに unit test を発見・実行できる」ことを機能として掲げています。
つまり、IDE 外に出て CLI だけで運用する必要はありません。Visual Studio の中だけで「作成 → 実行 → デバッグ」まで完結できます(ただし、プロジェクト形式がポイントになります)。
最重要チェック:プロジェクトが .njsproj か .esproj か
ここが今回のキモです。Visual Studio 2022 には大きく分けて 2 系統の JavaScript/Node 開発体験があります。
- 旧:Node.js プロジェクト(.njsproj)…「Blank Node.js Web Application」等で作られやすい形式
- 新:JavaScript/TypeScript プロジェクト(.esproj)…CLI ベースの新プロジェクト体験(npm 管理・テスト統合などが強い)
Microsoft の Visual Studio Blog でも、Visual Studio 2022 で .esproj という JavaScript/TypeScript 専用プロジェクト形式を用意したこと、そして npm 管理や VS Code 互換(launch.json など)を強化していることが明記されています。
| 項目 | .njsproj(旧) | .esproj(新) | 単体テスト観点 |
|---|---|---|---|
| 代表的テンプレート | Blank Node.js Web Application(など) | CLI ベースの JavaScript/TypeScript テンプレート | Test Explorer 連携は .esproj が分かりやすい |
| プロジェクトファイル編集 | 「Edit Project File」が出ないことがある | 「Edit Project File」で .esproj を編集できる | テスト検出設定(JavaScriptTestRoot 等)を入れやすい |
| 移行 | — | .njsproj から変換可能 | 既存資産があるなら「変換」が近道 |
.njsproj から .esproj に変換する(既存プロジェクトを活かす)
Visual Studio 2022 では、旧 Node.js プロジェクト(.njsproj)を新しい JavaScript プロジェクト(.esproj)に変換できます。変換することで、npm 依存関係管理や単体テストサポートなどの恩恵を受けられます。
- ソリューション エクスプローラーで対象の Node.js プロジェクトを右クリック
- 「Convert to New JavaScript Project Experience」(または TypeScript 版)を選択
- 変換ログが生成されるので、警告や置換結果を確認
- もし問題が出たら、「Revert Project to Old Experience」で戻すことも可能
新規で作り直す(もっともトラブルが少ない)
「とにかく早くテストを回したい」「資産が少ない」なら、新しいテンプレートで作り直すのが結果的に早いこともあります。Microsoft Q&A の事例でも、旧形式では編集メニューが出ず、新しいテンプレートで作り直したらテストもアプリ実行も両方動いた、という流れが共有されています。
また Visual Studio 2022 の Node.js/Express チュートリアルでは、「JavaScript Express Application」テンプレートを使ってプロジェクトを作る手順が案内されています(前提として Node.js と npm/npx が必要)。
Visual Studio 2022 で単体テスト環境を構成する手順(Jest 例)
ここからは「Visual Studio で完結させる」ことを目的に、Jest を使った最小構成をベースに説明します。Jest 以外でも考え方は同じで、後半に差分もまとめます。
前提:Node.js と npm/npx が使える状態にする
Node.js 開発では、パッケージ管理は npm が前提です。Visual Studio 側も Node.js + npm/npx の存在を前提にしているため、まずはターミナルで次が通るか確認してください。
node -v
npm -v
npx -v
テストファイルの置き場所を決める(おすすめは tests/)
Visual Studio のテスト検出では、「テストが入っているルートフォルダ」をプロジェクトファイルで指定できます。後から増えた時に迷子にならないよう、最初にフォルダを決めておくのがおすすめです。
例:こんな構成にすると運用が楽です。
プロジェクトルート
├─ src/
│ ├─ app.js
│ └─ ...
├─ tests/
│ ├─ sample.test.js
│ └─ ...
├─ package.json
└─ (.esproj など)
.esproj にテスト設定を書く(JavaScriptTestRoot / JavaScriptTestFramework)
Test Explorer に「どこにテストがあり、どのフレームワークを使うのか」を教えるのがこの設定です。Visual Studio の公式ドキュメントでも、.esproj の PropertyGroup に JavaScriptTestRoot と JavaScriptTestFramework を設定する例が示されています。
tests/ をテストルートにして、Jest を指定する例:
<PropertyGroup>
<JavaScriptTestRoot>tests\</JavaScriptTestRoot>
<JavaScriptTestFramework>Jest</JavaScriptTestFramework>
</PropertyGroup>
ポイントは次のとおりです。
- JavaScriptTestRoot:テストファイルを置くフォルダ(例:
tests\/src\) - JavaScriptTestFramework:
Jest/Mocha/Jasmine/Tape/Vitestなど
npm で Jest をインストールする(Visual Studio の UI でも OK)
Node.js のテストフレームワークは npm で devDependencies に入れるのが基本です。Visual Studio には npm パッケージを UI から入れる導線があります(Solution Explorer の npm ノードからインストール)。
ターミナルで入れるなら以下で OK です。
npm install --save-dev jest jest-editor-support
なお、Visual Studio の単体テスト統合で Jest を使う場合、jest と一緒に jest-editor-support が必要と公式ドキュメントに明記されています。
package.json に test スクリプトを定義する
Test Explorer の実行でも、CI でも、結局は プロジェクトの “正解のテストコマンド” を scripts に固定しておくのが一番ブレません。
{
"scripts": {
"start": "node src/app.js",
"test": "jest",
"test:watch": "jest --watch"
}
}
この形にしておくと、次のどちらでも同じテストが走ります。
- Visual Studio:Test Explorer から実行
- CLI:
npm test/npm run test:watch
最小のテストを書いて、Test Explorer で実行する
Jest のテストファイル(例:tests/sample.test.js)を作って、まずは「検出される」ことを確認します。
describe('サンプル', () => {
it('2 は 2 と等しい', () => {
expect(2).toBe(2);
});
});
Visual Studio 側は以下の流れです。
- メニューから 「テスト」→「テスト エクスプローラー」を開く
- テストが表示されない場合は 一度ビルド/リビルド(検出の更新)
- 「Run All」または個別テストを右クリックして実行
- 必要なら「Debug」でブレークポイントデバッグ
Express アプリを “テストしやすい形” に整える(実務で効くコツ)
「テスト実行ができる」だけだと、次にハマるのが Express のルーティングやミドルウェアをどう単体テストするかです。ここでは、実務で効く「分離」の考え方をひとつ紹介します。
サーバー起動と app 定義を分ける
よくある構成(テストしづらい)では、app.listen() が app 定義と同じファイルに書かれていて、テストから読み込むだけでサーバーが起動してしまいます。次のようにファイルを分けると、テストから app を安全に import できます。
例:src/app.js(app 定義だけ)
const express = require('express');
const app = express();
app.get('/health', (req, res) => res.status(200).send('ok'));
module.exports = app;
例:src/server.js(起動だけ)
const app = require('./app');
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`listening on ${port}`));
supertest で HTTP レベルのテストを書く
単体テスト〜軽量な結合テストの境目ですが、Express のルート確認は supertest が定番です。
npm install --save-dev supertest
例:tests/health.test.js
const request = require('supertest');
const app = require('../src/app');
describe('GET /health', () => {
it('200 ok を返す', async () => {
const res = await request(app).get('/health');
expect(res.statusCode).toBe(200);
expect(res.text).toBe('ok');
});
});
この形にしておくと、Test Explorer でも CLI でも同じように回せます。「テストがあるから怖くて触れない」状態から、「テストがあるから安心して触れる」状態へ移行しやすくなります。
Jasmine / Mocha / Tape / Vitest に切り替える場合の差分
Visual Studio の単体テスト統合では、フレームワーク名(JavaScriptTestFramework)と、npm で入れるパッケージ、scripts.testが揃っていれば基本の考え方は同じです。対応フレームワーク一覧は公式ドキュメントにまとまっています。
| フレームワーク | .esproj の指定例 | npm で入れる最小例 | package.json scripts.test 例 | メモ |
|---|---|---|---|---|
| Jest | Jest | jest + jest-editor-support | jest | Visual Studio 統合では jest-editor-support が必要 |
| Mocha | Mocha | mocha(好みで chai) | mocha | 素朴で拡張しやすい。既存資産が多い現場も多い |
| Jasmine | Jasmine | jasmine | jasmine | describe/it/expect の書き味は Jest に近い |
| Tape | Tape | tape | tape "tests/**/*.test.js" | ミニマル。テストの書き方が少し独特 |
| Vitest | Vitest | vitest | vitest | ESM と相性がよく、近年のフロント系で採用が増えがち |
「Jasmine を使いたい」という場合でも、やることは同じで、NuGet ではなく npmに寄せ、.esproj でフレームワークとテストルートを指定し、Test Explorer に流すのが王道です。Microsoft Q&A の回答も同じ方向性(.esproj + npm)で案内されています。
よくあるハマりどころと対処(Test Explorer に出ない・動かない)
最後に、つまずきやすいポイントを “症状→原因→対処” でまとめます。
| 症状 | よくある原因 | 対処 |
|---|---|---|
| テストが Test Explorer に表示されない | テストルートが違う / 設定未反映 | JavaScriptTestRoot を見直し、リビルドして再検出 |
| Jest を入れたのに実行できない | jest-editor-support が未導入 | npm i -D jest jest-editor-support |
| TypeScript のテストが見つからない/変な挙動 | tsconfig.json で outfile を使っている | outfile を避け、outDir を使う(config はプロジェクトルートに置く) |
| テスト検出時に ReadOnlySpan エラーが出る | 既知の MSBuild 問題に該当 | 公式ドキュメントの回避策(System.Memory.dll のリネーム)を検討。影響が大きいので、まずは VS 更新や最小構成で切り分け推奨 |
| プロファイル/コードカバレッジが欲しい | 現状サポート対象外 | 現時点では 未対応。必要なら別ツール(nyc など)で補う |
CLI 運用も併用したい場合:npm test と vstest.console
チーム開発や CI では、Visual Studio からだけでなく CLI でも同じテストが動くことが重要です。
- まずは npm test に寄せる(環境差が出にくい)
- 必要に応じて、.esproj を
vstest.consoleで実行して .NET のテスト運用と揃える
公式ドキュメントには、.esproj を vstest.console で実行する例と、TestAdapterPath の指定例も掲載されています(環境により Visual Studio のエディションやパスが異なる点に注意)。
vstest.console .\MyProj.esproj /TestAdapterPath:"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\Microsoft\JavaScript"
まとめ:Visual Studio で完結させるなら「npm + .esproj + Test Explorer」
- Node.js の単体テストは NuGet ではなく npm で管理する
- Visual Studio で Test Explorer 連携するなら、.esproj(新しい JavaScript/TypeScript プロジェクト)が扱いやすい
- 旧 .njsproj の場合は、変換(Convert to New JavaScript Project Experience)か、テンプレートで作り直すのが早い
- .esproj の
JavaScriptTestRootとJavaScriptTestFrameworkを設定し、Jest などを npm で導入すれば、Visual Studio 内だけで実行・デバッグが可能

コメント