如何自定义Xunit的TheoryBooleanAttribute简化布尔参数测试?
实现Xunit自定义[TheoryBoolean]特性简化布尔参数测试
解决方案思路
要实现仅用[TheoryBoolean]替代[Theory]+[InlineData(false)]+[InlineData(true)]的重复代码,需要自定义继承自TheoryAttribute的特性,并搭配自定义数据发现器来自动提供布尔测试数据。
具体实现代码
1. 创建自定义TheoryBooleanAttribute
using Xunit; using Xunit.Sdk; // 指定自定义数据发现器,替换命名空间和程序集名称为实际项目值 [DataDiscoverer("YourTestProjectNamespace.BooleanTheoryDataDiscoverer", "YourTestProjectAssemblyName")] public class TheoryBooleanAttribute : TheoryAttribute { }
2. 实现自定义数据发现器
using System.Collections.Generic; using System; using Xunit.Abstractions; using Xunit.Sdk; namespace YourTestProjectNamespace { public class BooleanTheoryDataDiscoverer : IDataDiscoverer { // 允许测试运行器枚举生成的测试案例 public bool SupportsDiscoveryEnumeration(IAttributeInfo dataAttribute, IMethodInfo testMethod) { return true; } // 提供布尔测试数据 public IEnumerable<object[]> GetData(IAttributeInfo dataAttribute, IMethodInfo testMethod) { // 校验测试方法参数是否符合要求(单个bool参数) var parameters = testMethod.GetParameters(); if (parameters.Length != 1 || parameters[0].ParameterType != typeof(bool)) { throw new InvalidOperationException("[TheoryBoolean]仅支持带有单个bool类型参数的测试方法"); } // 返回false和true两组测试数据 yield return new object[] { false }; yield return new object[] { true }; } } }
原方案问题原因说明
- 原方案1:仅继承
TheoryAttribute并使用默认DataDiscoverer时,默认发现器会强制要求提供InlineData/ClassData等显式数据,无法自动生成布尔值,因此必须自定义DataDiscoverer来提供预设数据。 - 原方案2:继承
DataAttribute并标记TheoryDiscoverer是职责匹配错误,TheoryDiscoverer是用来识别TheoryAttribute的处理器,而DataAttribute是提供测试数据的特性,两者搭配会导致测试GUI无法正确识别测试案例。
使用方式
直接在测试方法上标注[TheoryBoolean]即可:
[TheoryBoolean] public async Task TestWhatever(bool value) { // 测试逻辑代码 }
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

