一键导入
xunit-unit-testing
Use when: xUnit unit tests, .NET unit tests, test project setup, FluentAssertions, NSubstitute, Verify, Bogus, MockQueryable, coverage, mutation
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when: xUnit unit tests, .NET unit tests, test project setup, FluentAssertions, NSubstitute, Verify, Bogus, MockQueryable, coverage, mutation
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | xunit-unit-testing |
| description | Use when: xUnit unit tests, .NET unit tests, test project setup, FluentAssertions, NSubstitute, Verify, Bogus, MockQueryable, coverage, mutation |
À charger pour toute création, correction, revue, ou extension de tests unitaires .NET/xUnit dans ce dépôt. Ce skill complète
dotnet-patterns. Il s'applique aux tests unitaires backend et génération .NET, pas aux tests Angular, E2E, ou aux golden/parity tests.
tests/.<TargetAssembly>.Tests.tests/<TargetAssembly>.Tests/<TargetAssembly>.Tests.csproj.ProjectReference vers l'assembly testé.tests/InfraFlowSculptor.GenerationParity.Tests.
Ce dossier est conservé vide à part et n'héberge actuellement aucun .csproj actif.Exemples attendus dans ce dépôt :
src/Api/InfraFlowSculptor.Domain -> tests/InfraFlowSculptor.Domain.Testssrc/Api/InfraFlowSculptor.Application -> tests/InfraFlowSculptor.Application.Testssrc/Api/InfraFlowSculptor.Infrastructure -> tests/InfraFlowSculptor.Infrastructure.Testssrc/Api/InfraFlowSculptor.BicepGeneration -> tests/InfraFlowSculptor.BicepGeneration.TestsPour les moteurs de génération :
.Tests dédié.tests/InfraFlowSculptor.GenerationParity.Tests/, mais il n'existe pas de projet actif aujourd'hui.Si le projet .Tests n'existe pas encore, le créer sous tests/, l'ajouter à InfraFlowSculptor.slnx, et utiliser les conventions suivantes :
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<RootNamespace>InfraFlowSculptor.Domain.Tests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="xunit" />
<PackageReference Include="xunit.runner.visualstudio">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Api\InfraFlowSculptor.Domain\InfraFlowSculptor.Domain.csproj" />
</ItemGroup>
</Project>
Règles associées :
net10.0, comme le test project déjà présent.Directory.Packages.props.Directory.Packages.props, puis la référencer sans Version= dans le .csproj.Base minimale :
Microsoft.NET.Test.Sdkxunitxunit.runner.visualstudioOutils à utiliser quand le scénario le justifie :
FluentAssertionsNSubstituteVerify.XunitBogusMockQueryable.NSubstituteMicrosoft.Extensions.TimeProvider.Testing avec FakeTimeProviderRègles :
FluentAssertions est l'outil par défaut pour les assertions lisibles.NSubstitute est l'outil par défaut pour les dépendances substituables.Verify.Xunit est préférable pour des objets complexes, contrats, payloads, ou graphes sérialisables stables.Bogus est utile pour enrichir les cas réalistes, mais toujours avec un seed fixe.NullLogger<T>.Instance par défaut. N'utiliser un logger de test que si le log fait partie du comportement vérifié.Conventions de nommage :
<SutName>Tests<SutName>Tests.csGiven_{Preconditions}_When_{StateUnderTest}_Then_{ExpectedBehavior}_Async quand la méthode testée est asynchrone.Conventions SUT :
sut_sutLe skill dotnet-patterns demande des XML docs pour le code de production. Cette règle ne s'applique pas aux tests xUnit : le nom du test porte l'intention, pas un commentaire XML.
Les tests suivent le pattern Arrange / Act / Assert.
public sealed class ExampleServiceTests
{
private readonly IDependency _dependency;
private readonly ExampleService _sut;
public ExampleServiceTests()
{
_dependency = Substitute.For<IDependency>();
_sut = new ExampleService(_dependency);
}
[Fact]
public void Given_ValidInput_When_DoWork_Then_ReturnsExpectedValue()
{
// Arrange
const string input = "alpha";
const string expectedValue = "ALPHA";
_dependency.Transform(input).Returns(expectedValue);
// Act
var result = _sut.DoWork(input);
// Assert
result.Should().Be(expectedValue);
}
}
Rappels xUnit modernes :
IAsyncLifetime pour le setup/cleanup async.CollectionFixture ou ClassFixture pour de l'état mutable partagé.[Fact] pour un cas autonome.[Theory] quand le même comportement et la même assertion sont validés pour plusieurs entrées.[InlineData] pour des types simples.MemberData ou ClassData pour des objets plus riches ou des jeux de données volumineux.Règle importante :
Theory est adaptée.Typologies à utiliser consciemment :
Règles :
IRepository<T>, ICurrentUser, clients Refit, etc.).Exemple NSubstitute :
public sealed class EmailSenderTests
{
private readonly IEmailClient _emailClient;
private readonly EmailSender _sut;
public EmailSenderTests()
{
_emailClient = Substitute.For<IEmailClient>();
_sut = new EmailSender(_emailClient);
}
[Fact]
public void Given_ValidEmailAddress_When_SendWelcomeEmail_Then_ReturnsTrue()
{
// Arrange
const string toAddress = "test@example.com";
_emailClient.SendEmail(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).Returns(true);
// Act
var result = _sut.SendWelcomeEmail(toAddress);
// Assert
result.Should().BeTrue();
_emailClient.Received(1).SendEmail(toAddress, Arg.Any<string>(), Arg.Any<string>());
}
}
const explicites pour les entrées et les attendus.Bogus :
Randomizer.Seed = new Random(123456);
Temps et dates :
DateTime.Now, DateTime.UtcNow, DateOnly.FromDateTime(DateTime.Now), etc.TimeProvider.FakeTimeProvider quand il faut piloter le temps.Culture et fuseau :
Pour les objets complexes et les contrats stables, utiliser Verify.Xunit.
Règles :
.verified.*..received.*.NullLogger<T>.Instance.DefaultHttpContext quand quelques propriétés concrètes suffisent.IHttpContextAccessor ou HttpContext autour de la surface virtuelle strictement nécessaire.IQueryable, utiliser MockQueryable.NSubstitute.HttpClient en unitaire.Après ajout ou modification de tests unitaires :
# Suite .NET complète
dotnet test .\InfraFlowSculptor.slnx
# Projet de test ciblé
dotnet test .\tests\<TargetAssembly>.Tests\<TargetAssembly>.Tests.csproj
# Ciblage plus fin pendant l'itération
dotnet test .\tests\<TargetAssembly>.Tests\<TargetAssembly>.Tests.csproj --filter "FullyQualifiedName~<SutName>"
Règle de fin de tâche :
dotnet test .\InfraFlowSculptor.slnx avant restitution.Couverture :
dotnet test .\InfraFlowSculptor.slnx --collect:"XPlat Code Coverage"
Mutation testing :
dotnet tool install --global dotnet-stryker
dotnet stryker --project .\tests\<TargetAssembly>.Tests\<TargetAssembly>.Tests.csproj
Règles :
tests/ et nommé <TargetAssembly>.TestsInfraFlowSculptor.GenerationParity.TestsGiven_When_Then(_Async) respectésut / _sut utilisés explicitementdotnet test projet puis solution exécutéAngular frontend project conventions. Use when generating or reviewing Angular code for signals, standalone components, strong typing, one-class-per-file, enums/constants, routing, services, and i18n.
Generate or extend a CQRS feature in InfraFlowSculptor. Use for aggregates, commands, queries, handlers, validators, repositories, contracts, and API endpoints with strong typing and one-type-per-file conventions.
C#/.NET project conventions. Use when generating or reviewing backend code for naming, XML docs, one-type-per-file, no magic strings, strong typing, and design-pattern selection.
Use when: corpus-level questions, documentation graph, architecture overview from docs+code, onboarding orientation, audit context, cross-file conceptual links, god nodes, community detection, surprising connections, diagram-to-code traceability, or any question that spans documentation and code rather than pure code structure.
Use when: model context protocol, MCP, MCP server, C# MCP, .NET MCP, VS Code mcp.json, local stdio MCP, remote HTTP MCP, deployed MCP endpoint, streamable HTTP, tools/resources/prompts, AI tool integration, create project from prompt, monorepo, split infra/code, clarification workflow, elicitation, IaC import, diagram-to-project, migration planning, or long-term MCP architecture for InfraFlowSculptor.
Use when creating, editing, or generating draw.io diagram files (.drawio, .drawio.svg, .drawio.png). Covers mxGraph XML authoring, shape libraries, style strings, flowcharts, system architecture, sequence diagrams, ER diagrams, UML class diagrams, network topology, layout strategy, the hediet.vscode-drawio VS Code extension, and the full agent workflow from request to a ready-to-open file.