You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:22:58