如何在不设为public的情况下让测试项目使用internal枚举?
问题解决:xUnit测试internal枚举时的可访问性错误
你遇到的错误根源是C#的访问级别规则:public方法的参数类型不能比方法本身的访问级别低。你的测试方法是public,但参数MyEnum是internal,即使通过InternalsVisibleTo让测试项目能访问这个枚举,编译时仍然会因为这个规则报错。
不用把MyEnum改成public,有两种可行的解决办法:
方法一:将测试方法改为internal并配置xUnit访问权限
- 把测试方法的访问修饰符从
public改成internal - 在测试项目的
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
相关产品推荐
相关产品推荐

