ASP.NET Core 6集成测试中Program类访问权限与入口点冲突问题求助
ASP.NET Core 6集成测试中Program类访问权限与入口点冲突问题求助
兄弟,我之前也碰到过一模一样的问题,其实这都是ASP.NET Core 6的顶级语句特性搞的鬼,给你说个简单又靠谱的解决办法:
首先得搞清楚问题根源:
- ASP.NET Core 6默认用顶级语句写Program.cs,编译器会自动生成一个
internal的Program类和入口方法,所以你的测试项目(和Web项目不是同一个程序集)根本访问不到这个类,就会报“The ‘Program’ element is inaccessible due to the protection level”错误。 - 如果你直接给Program.cs加命名空间和
public class Program,相当于手动又定义了一个带Main方法的类,加上编译器自动生成的那个,就会出现两个入口点,触发“CS0017: More than one entry point is defined”错误。
最优解决步骤:
- 不用修改原有的顶级语句代码,直接在你的Program.cs文件的最末尾添加一行代码:
public partial class Program { }
这行代码的作用是把编译器自动生成的Program类标记为public的partial类,既不会新增入口点,又能让测试项目访问到它。
- 在你的集成测试项目里,就能正常引用Web项目的
Program类来创建测试工厂了,示例代码如下:
using var factory = new WebApplicationFactory<Program>(); var testClient = factory.CreateClient(); // 接下来就可以用testClient调用你的Token API做集成测试啦 var response = await testClient.PostAsync("/api/token", yourRequestContent); // 验证响应结果...
另一种备选方案(稍繁琐):
如果你更习惯显式的类结构,也可以把Program.cs改成传统的类写法,确保只有一个入口点:
namespace TokenProject; public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // 把你原来的所有配置代码(CORS、DbContext、JWT认证等)都放到这里 builder.Services.AddCors(options => { options.AddPolicy("AllowAngularApp", builder => { builder.WithOrigins("你的Angular地址") .AllowAnyHeader() .AllowAnyMethod(); }); }); // 其他配置... var app = builder.Build(); // 中间件配置... app.UseCors("AllowAngularApp"); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); } }
这样改完后,测试项目也能直接引用TokenProject.Program类,而且不会出现入口点冲突的问题。
备注:内容来源于stack exchange,提问作者Meliqe
相关产品推荐
相关产品推荐

