ワンクリックで
bunit
bUnit 2.x を使用した Blazor コンポーネントのユニットテストのベストプラクティスとガイドライン
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
bUnit 2.x を使用した Blazor コンポーネントのユニットテストのベストプラクティスとガイドライン
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Modular Monolith + Clean Architecture の設計ガイド。新しいモジュールの作成、画面の実装、機能追加を行う際には、必ずこのスキルを参照して従ってください。
7 つのカスタムエージェント(Orchestrator / Product Manager / Architect / Developer / Reviewer / Tester / Documentation)が協調して機能開発を自律的に進めるワークフロースキル。仕様策定から実装・テスト・マージ、およびドキュメント追従までの全ライフサイクルを定義する。
このリポジトリでの開発フロー(GitHub Flow)を定義するスキル。feature ブランチの作成から Draft PR、レビュー、Squash Merge までの一連の作業手順とルールを示します。コードを変更する作業を行う場合は、必ずこのスキルに従ってください。
feature-lifecycle で作成済みの PR に対して、レビュー指摘やユーザーの直接指示による微修正を軽量フローで反映するスキル。Orchestrator から Developer に委譲して実行する。
GitHub Cloud Agent の readonly GitHub CLI 制約下で feature-lifecycle を回すためのファイルベース運用スキル。Issue/PR への書き込みができない場合に、仕様・状態台帳・エージェント間ログ・PR 本文案をリポジトリ内ファイルとして管理する。
Playwright MCP server が提供されている場合は MCP を優先し、未提供時は playwright-cli で E2E テストを実行するスキル。ブラウザを headless モードで起動し、テスト結果を screenshots/ 配下の日付付きフォルダーに保存する。E2E テストを実行する際には、必ずこのスキルに従ってください。
| name | bunit |
| description | bUnit 2.x を使用した Blazor コンポーネントのユニットテストのベストプラクティスとガイドライン |
bUnit 2.x (現行最新 v2.7.x) を使った Blazor コンポーネントのユニットテスト作成を支援する。 テストコードは C# (.cs) ファイルで記述し、テストフレームワークには MSTest を使用する。
重要: bUnit 2.x は .NET 8 以上 を必須とする。
詳細なリファレンスは references/ フォルダを参照 — 必要に応じてオンデマンドで読み込む。
| リファレンス | 内容 |
|---|---|
| parameters.md | パラメータ渡しの全パターン (EventCallback, ChildContent, Bind, Cascading 等) |
| test-doubles.md | JSInterop, NavigationManager, 認証, HttpClient, ComponentStub |
| async-testing.md | WaitForAssertion, WaitForState, WaitForElement, TaskCompletionSource |
<Project Sdk="MSTest.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="bunit" Version="2.7.*" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MyApp\MyApp.csproj" />
</ItemGroup>
</Project>
global.json には .NET 10 の Microsoft Testing Platform runner と MSTest.Sdk のバージョンを指定する。
{
"test": {
"runner": "Microsoft.Testing.Platform"
},
"msbuild-sdks": {
"MSTest.Sdk": "4.2.1"
}
}
テストプロジェクト内に
.razorファイルを置く特別な理由がない限り、SDK はMSTest.Sdkを使用すること。アプリ側の Razor コンポーネントは Web プロジェクトへのProjectReference経由でテストする。
[TestClass]
public sealed class CounterTests : BunitContext
{
[TestMethod]
public void Counter_InitialRender_DisplaysZero()
{
// Act
var cut = Render<Counter>();
// Assert
cut.Find("p").MarkupMatches("<p>Current count: 0</p>");
}
}
[TestMethod]
public void Counter_InitialRender_DisplaysZero()
{
using var ctx = new BunitContext();
var cut = ctx.Render<Counter>();
cut.MarkupMatches("<p>Current count: 0</p>");
}
var cut = Render<MyComponent>(); // パラメータなし
var cut = Render<MyComponent>(p => p.Add(x => x.Name, "test")); // パラメータ付き
cut.Render(p => p.Add(x => x.Name, "updated")); // 再レンダリング
cut.MarkupMatches("<p>Hello</p>"); // セマンティック HTML 比較
cut.Find("h1").MarkupMatches("<h1>Title</h1>"); // 要素単位
Assert.AreEqual("Hello", cut.Find("p").TextContent);
var btn = cut.Find("button.primary"); // CSS セレクタ
var items = cut.FindAll("li"); // 複数 (自動更新なし)
var child = cut.FindComponent<TaskItem>(); // 子コンポーネント
var children = cut.FindComponents<TaskItem>(); // 複数
cut.Find("button").Click();
cut.Find("input").Change("new value");
cut.Find("form").Submit();
cut.Find("input").TriggerEvent("oncustompaste", new CustomPasteEventArgs { ... });
cut.WaitForAssertion(() => cut.Find("p").MarkupMatches("<p>Done</p>"));
cut.WaitForState(() => cut.Instance.IsLoaded);
cut.WaitForElement("button.submit");
cut.WaitForElements("li", 3);
cut.WaitForComponent<ListItem>();
Services.AddSingleton<IMyService>(new MockMyService());
JSInterop.Mode = JSRuntimeMode.Loose; // JS 呼び出しを緩和
ComponentFactories.AddStub<HeavyChild>(); // 子コンポーネントをスタブ化
sealed にするComponentName_Scenario_ExpectedBehaviorcut を使用MarkupMatches で構造を検証Find + TextContent / Instance でセマンティックに検証OnInitializedAsync を持つコンポーネントには必ず WaitForAssertion / WaitForState を使用TaskCompletionSource<T> で非同期依存をシミュレートServices に登録Setup するComponentFactories.AddStub<T>() を使用FindAll の結果を再利用せずに更新を期待する(再度 FindAll を呼ぶこと)Setup なしに JS 呼び出しを持つコンポーネントをレンダリング