帮助你为 C#/.NET 项目编写、组织并优化单元与集成测试。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "csharp-testing" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/skills/csharp-testing/SKILL.md 2. 保存为 ~/.claude/skills/csharp-testing/SKILL.md 3. 装好后重载技能,告诉我可以用了
请为这个 C# OrderService 编写 xUnit 单元测试,使用 Arrange-Act-Assert 结构和 FluentAssertions,覆盖成功下单与空商品失败两种情况。
一组结构清晰的 xUnit 测试代码,包含成功与失败场景断言。
请把这个邮箱校验方法改写为 xUnit Theory 参数化测试,使用 InlineData 覆盖合法与非法邮箱输入。
使用 Theory 和 InlineData 的参数化测试代码示例。
请审查这组 .NET 测试代码,指出可读性、覆盖范围、mock 使用和测试组织上的改进建议。
针对测试结构、断言方式、覆盖盲点与组织实践的改进清单。
开发者在编写新的 .NET 业务逻辑时,可用它快速建立 xUnit 测试、断言模式和基础测试结构。它适合把常见测试写法整理成一致规范。
当团队需要评估现有测试是否清晰、完整或易维护时,可用它审查测试组织、参数化测试和 mock 使用方式。
在 ASP.NET Core 或依赖真实基础设施的项目中,可参考它使用 WebApplicationFactory、Testcontainers 等方式组织集成测试。
文档介绍了 .NET 应用的测试模式与实践,重点围绕 xUnit、FluentAssertions、NSubstitute/Moq 等工具栈展开。内容涵盖单元测试的 Arrange-Act-Assert 结构、Theory 参数化测试,以及集成测试、测试基础设施搭建、测试质量审查和排查缓慢或不稳定测试的适用场景。
Comprehensive testing patterns for .NET applications using xUnit, FluentAssertions, and modern testing practices.
| Tool | Purpose |
|---|---|
| xUnit | Test framework (preferred for .NET) |
| FluentAssertions | Readable assertion syntax |
| NSubstitute or Moq | Mocking dependencies |
| Testcontainers | Real infrastructure in integration tests |
| WebApplicationFactory | ASP.NET Core integration tests |
| Bogus | Realistic test data generation |
public sealed class OrderServiceTests
{
private readonly IOrderRepository _repository = Substitute.For<IOrderRepository>();
private readonly ILogger<OrderService> _logger = Substitute.For<ILogger<OrderService>>();
private readonly OrderService _sut;
public OrderServiceTests()
{
_sut = new OrderService(_repository, _logger);
}
[Fact]
public async Task PlaceOrderAsync_ReturnsSuccess_WhenRequestIsValid()
{
// Arrange
var request = new CreateOrderRequest
{
CustomerId = "cust-123",
Items = [new OrderItem("SKU-001", 2, 29.99m)]
};
// Act
var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);
// Assert
result.IsSuccess.Should().BeTrue();
result.Value.Should().NotBeNull();
result.Value!.CustomerId.Should().Be("cust-123");
}
[Fact]
public async Task PlaceOrderAsync_ReturnsFailure_WhenNoItems()
{
// Arrange
var request = new CreateOrderRequest
{
CustomerId = "cust-123",
Items = []
};
// Act
var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);
// Assert
result.IsSuccess.Should().BeFalse();
result.Error.Should().Contain("at least one item");
}
}
[Theory]
[InlineData("", false)]
[InlineData("a", false)]
[InlineData("[email protected]", false)]
[InlineData("[email protected]", true)]
[InlineData("[email protected]", true)]
public void IsValidEmail_ReturnsExpected(string email, bool expected)
{
EmailValidator.IsValid(email).Should().Be(expected);
}
[Theory]
[MemberData(nameof(InvalidOrderCases))]
public async Task PlaceOrderAsync_RejectsInvalidOrders(CreateOrderRequest request, string expectedError)
{
var result = await _sut.PlaceOrderAsync(request, CancellationToken.None);
result.IsSuccess.Should().BeFalse();
result.Error.Should().Contain(expectedError);
}
public static TheoryData<CreateOrderRequest, string> InvalidOrderCases => new()
{
{ new() { CustomerId = "", Items = [ValidItem()] }, "CustomerId" },
{ new() { CustomerId = "c1", Items = [] }, "at least one item" },
{ new() { CustomerId = "c1", Items = [new("", 1, 10m)] }, "SKU" },
};
[Fact]
public async Task GetOrderAsync_ReturnsNull_WhenNotFound()
{
// Arrange
var orderId = Guid.NewGuid();
_repository.FindByIdAsync(orderId, Arg.Any<CancellationToken>())
.Returns((Order?)null);
// Act
var result = await _sut.GetOrderAsync(orderId, CancellationToken.None);
// Assert
result.Should().BeNull();
}
[Fact]
public async Task PlaceOrderAsync_PersistsOrder()
{
// Arrange
var request = ValidOrderRequest();
// Act
await _sut.PlaceOrderAsync(request, CancellationToken.None);
// Assert — verify the repository was called
await _repository.Received(1).AddAsync(
Arg.Is<Order>(o => o.CustomerId == request.CustomerId),
Arg.Any<CancellationToken>());
}
…
它用于 C# 和 .NET 测试实践,包括 xUnit、FluentAssertions、mock、集成测试以及测试组织最佳实践。适合编写新测试、审查测试质量和排查不稳定测试。
文档节选提到的工具包括 xUnit、FluentAssertions、NSubstitute 或 Moq、Testcontainers、WebApplicationFactory 和 Bogus。具体配置方式见源码仓库。
包含。文档节选明确提到使用 Testcontainers 进行真实基础设施集成测试,以及使用 WebApplicationFactory 做 ASP.NET Core 集成测试。
提供 TypeScript、Python 与 Go 的健壮错误处理模式与用户提示策略
帮助管理承运商组合、议价、绩效评估与运力分配策略
帮助你设计并实现 F# 单元、属性与集成测试的最佳实践
为 Quarkus 3.x 项目提供测试驱动开发方案,支持功能开发、修复与重构。
通过 fal.ai 一站式生成图片、视频与音频内容,满足多模态创作需求
为 Quarkus 项目执行发布前验证闭环,涵盖构建、测试、扫描与差异审查。
提供地道的 C# 与 .NET 架构模式、异步编程和依赖注入实践建议
帮助你系统掌握 Rust 测试模式与 TDD 实践,提升代码质量与可维护性。
帮助开发者用 Kotest、MockK 与协程测试构建高质量 Kotlin 测试体系。
帮助你用地道 Go 实践编写测试、基准、模糊测试并提升覆盖率。
为 .NET 与 C# 开发提供可复用技能,帮助 AI 编码代理更高效完成任务
帮助开发者识别并避免常见测试反模式,提升单元测试可维护性与可靠性。