🚀 快速安装
复制以下命令并运行,立即安装此 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 原始英文文档,方便对照翻译。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)