Visual Studio 2022 の Node.js アプリで単体テストを実行する方法(Test Explorer / Jest / .esproj)

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 開発の“標準”とはズレやすいです(もちろん特殊な事情で必要になるケースはあります)。

観点NuGetnpmNode.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 依存関係管理や単体テストサポートなどの恩恵を受けられます。

  1. ソリューション エクスプローラーで対象の Node.js プロジェクトを右クリック
  2. 「Convert to New JavaScript Project Experience」(または TypeScript 版)を選択
  3. 変換ログが生成されるので、警告や置換結果を確認
  4. もし問題が出たら、「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 側は以下の流れです。

  1. メニューから 「テスト」→「テスト エクスプローラー」を開く
  2. テストが表示されない場合は 一度ビルド/リビルド(検出の更新)
  3. 「Run All」または個別テストを右クリックして実行
  4. 必要なら「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 例メモ
JestJestjest + jest-editor-supportjestVisual Studio 統合では jest-editor-support が必要
MochaMochamocha(好みで chai)mocha素朴で拡張しやすい。既存資産が多い現場も多い
JasmineJasminejasminejasminedescribe/it/expect の書き味は Jest に近い
TapeTapetapetape "tests/**/*.test.js"ミニマル。テストの書き方が少し独特
VitestVitestvitestvitestESM と相性がよく、近年のフロント系で採用が増えがち

「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 内だけで実行・デバッグが可能

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次