ASP.NET 6 Core集成测试报CS0051不一致可访问性编译错误
错误原因
CS0051错误的核心逻辑是:公共方法/构造函数的参数类型访问权限,不能低于方法本身的访问权限。你虽然确认了ProjectsControllerTests和CustomWebApplicationFactory<TStartup>都是public修饰,但忽略了泛型参数Program的访问权限:
ASP.NET 6及以上版本使用默认顶级语句模板生成的Program.cs,没有显式声明Program类,编译器自动生成的Program类默认访问修饰符为internal,这就导致CustomWebApplicationFactory<Program>这个封闭泛型类型的实际访问权限为internal,而你的测试类构造函数是public,参数为internal类型,就触发了访问性不一致的报错。
解决方案
推荐使用最简单的显式声明Program类为public的方案:
- 打开你的Web项目的
Program.cs文件,在文件的最末尾添加一行代码:
public partial class Program { }
这行代码会显式将编译器自动生成的Program类声明为公共分部类,直接将其访问权限提升为public,CustomWebApplicationFactory<Program>的访问权限也会随之变为public,即可解决报错。
如果不希望修改Web项目的Program访问权限,也可以用第二种方案:
- 将测试类的构造函数修饰符改为
internal - 在Web项目的任意代码文件(一般放在AssemblyInfo.cs或者Program.cs顶部)添加程序集可见性声明:
[assembly: InternalsVisibleTo("你的测试项目的程序集名称")]
如果你的测试框架用到了动态代理(比如Moq、xUnit的某些扩展),还需要额外添加:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
附加检查项
如果修改后还是报错,可以再检查两个依赖类的访问权限:
- 你的
myDbContext类是否为public修饰 - 自定义的
MockAuthHandler类是否为public修饰
内容的提问来源于stack exchange,提问作者r .r
相关产品推荐
相关产品推荐

