🚀 快速安装

复制以下命令并运行,立即安装此 Skill:

npx @anthropic-ai/skills install github/awesome-copilot/csharp-xunit

💡 提示:需要 Node.js 和 NPM

XUnit 最佳实践

您的目标是帮助我使用 XUnit 编写有效的单元测试,涵盖标准测试和数据驱动测试方法。

项目设置

  • 使用一个单独的测试项目,命名约定为 [项目名称].Tests
  • 引用 Microsoft.NET.Test.Sdk、xunit 和 xunit.runner.visualstudio 包
  • 创建与被测试类匹配的测试类(例如,为 Calculator 创建 CalculatorTests
  • 使用 .NET SDK 测试命令:dotnet test 运行测试

测试结构

  • 不需要测试类属性(与 MSTest/NUnit 不同)
  • 对于简单测试,使用带有 [Fact] 属性的基于事实的测试
  • 遵循“Arrange-Act-Assert”(AAA,即:准备-执行-断言)模式
  • 使用 方法名_场景_预期行为 的模式命名测试
  • 使用构造函数进行初始化,使用 IDisposable.Dispose() 进行清理
  • 在类中的测试之间共享上下文时,使用 IClassFixture<T>
  • 在多个测试类之间共享上下文时,使用 ICollectionFixture<T>

标准测试

  • 保持测试专注于单一行为
  • 避免在一个测试方法中测试多个行为
  • 使用能清晰表达意图的断言
  • 只包含验证测试用例所需的断言
  • 使测试独立且幂等(可以以任何顺序运行)
  • 避免测试之间的相互依赖

数据驱动测试

  • [Theory] 与数据源属性结合使用
  • 对内联测试数据使用 [InlineData]
  • 对基于方法的测试数据使用 [MemberData]
  • 对基于类的测试数据使用 [ClassData]
  • 通过实现 DataAttribute 创建自定义数据属性
  • 在数据驱动测试中使用有意义的参数名称

断言

  • 使用 Assert.Equal 进行值相等性比较
  • 使用 Assert.Same 进行引用相等性比较
  • 对布尔条件使用 Assert.True/Assert.False
  • 对集合使用 Assert.Contains/Assert.DoesNotContain
  • 对正则表达式模式匹配使用 Assert.Matches/Assert.DoesNotMatch
  • 使用 Assert.Throws<T>await Assert.ThrowsAsync<T> 测试异常
  • 为获得更易读的断言,可以使用 Fluent Assertions 库

模拟与隔离

  • 考虑将 Moq 或 NSubstitute 与 XUnit 一起使用
  • 模拟依赖项以隔离被测试单元
  • 使用接口以便于模拟
  • 对于复杂的测试设置,考虑使用依赖注入容器

测试组织

  • 按功能或组件对测试进行分组
  • 使用 [Trait(“Category”, “CategoryName”)] 进行分类
  • 使用集合固件对具有共享依赖项的测试进行分组
  • 考虑使用输出助手 (ITestOutputHelper) 进行测试诊断
  • 在 fact/theory 属性中使用 Skip = “原因” 有条件地跳过测试

📄 原始文档

完整文档(英文):

https://skills.sh/github/awesome-copilot/csharp-xunit

💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。