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

如何在不设为public的情况下让测试项目使用internal枚举?

问题解决:xUnit测试internal枚举时的可访问性错误

你遇到的错误根源是C#的访问级别规则:public方法的参数类型不能比方法本身的访问级别低。你的测试方法是public,但参数MyEnum是internal,即使通过InternalsVisibleTo让测试项目能访问这个枚举,编译时仍然会因为这个规则报错。

不用把MyEnum改成public,有两种可行的解决办法:

方法一:将测试方法改为internal并配置xUnit访问权限

  1. 把测试方法的访问修饰符从public改成internal
  2. 在测试项目的InternalsVisibleTo配置中,添加xUnit执行程序集的可见性,让xUnit能识别你的internal测试方法:
    // .NET Core/.NET 5+ 使用这个
    [assembly: InternalsVisibleTo("xunit.execution.dotnet")]
    // .NET Framework 使用这个
    [assembly: InternalsVisibleTo("xunit.execution.desktop")]
    

修改后的测试代码:

[Theory]
[InlineData(MyEnum.EnumValue, "value")]
internal void MyAttributeWorksCorrectly(MyEnum myEnum, string expectedAttributeValue) 
{
    // 你的测试逻辑
}

方法二:用MemberData替代InlineData

InlineData是编译时解析的,会触发可访问性检查;而MemberData是运行时加载测试数据,不受这个编译规则限制。你可以定义一个internal的静态数据源,然后在测试方法中引用它:

public class MyEnumTests
{
    // 定义internal的测试数据源
    internal static IEnumerable<object[]> TestAttributeData => new List<object[]>
    {
        new object[] { MyEnum.EnumValue, "value" }
    };

    [Theory]
    [MemberData(nameof(TestAttributeData))]
    public void MyAttributeWorksCorrectly(MyEnum myEnum, string expectedAttributeValue) 
    {
        // 你的测试逻辑
    }
}

这种方法不需要修改测试方法的访问级别,也不用额外配置xUnit的可见性,适合需要动态生成测试数据的场景。

内容的提问来源于stack exchange,提问作者mati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:24:56