一键导入
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 呼び出しを持つコンポーネントをレンダリング