.NET 6 Razor项目使用Playwright内存测试服务器遇配置方法缺失错误求助
解决.NET 6顶级语句Program.cs下Playwright内存测试服务器启动错误
我需要启动内存中的Playwright,针对内存测试服务器运行端到端测试。我将一个.NET Core 3.1 MVC项目升级到.NET 6,并添加了使用顶级语句的Razor项目。运行测试用例When_ClickEmployeeMenuOption_Then_EmployeesPageDisplayed_Chrome时,出现错误:
System.InvalidOperationException: 'A public method named 'ConfigureAutomatedTesting' or 'Configure' could not be found in the 'Program' type.'
原因
.NET 6的顶级语句会生成隐式的内部Program类,测试框架(如WebApplicationFactory)无法找到所需的Configure或ConfigureAutomatedTesting公共方法,导致报错。
解决方法
方法1:显式声明Program类并暴露配置方法
将Web项目的顶级语句Program.cs改为显式类结构,暴露公共的配置方法:
namespace YourWebProjectNamespace; public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // 保留原有的服务配置代码 builder.Services.AddRazorPages(); // ...其他服务配置 var app = builder.Build(); // 调用公共Configure方法复用中间件配置 Configure(app); app.Run(); } // 暴露公共Configure方法供测试框架调用 public static void Configure(IApplicationBuilder app) { // 保留原有的中间件配置逻辑 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); } }
方法2:允许测试项目访问内部Program类
如果不想修改Web项目的Program.cs结构,可以在Web项目的.csproj文件中添加配置,让测试项目能访问隐式生成的内部Program类:
<ItemGroup> <InternalsVisibleTo Include="YourTestProjectName" /> </ItemGroup>
然后在测试类中直接使用WebApplicationFactory<Program>,并按需配置测试服务器:
public class EmployeePageTests : IClassFixture<WebApplicationFactory<Program>> { private readonly WebApplicationFactory<Program> _webAppFactory; public EmployeePageTests(WebApplicationFactory<Program> webAppFactory) { _webAppFactory = webAppFactory.WithWebHostBuilder(builder => { // 这里可以添加测试环境的定制配置,比如替换服务、修改环境变量等 builder.UseEnvironment("Testing"); }); } [Fact] public async Task When_ClickEmployeeMenuOption_Then_EmployeesPageDisplayed_Chrome() { // 启动Playwright并连接到测试服务器 using var playwright = await Playwright.CreateAsync(); await using var browser = await playwright.Chromium.LaunchAsync(); var page = await browser.NewPageAsync(); // 访问测试服务器的基地址 await page.GotoAsync(_webAppFactory.Server.BaseAddress); // 执行点击员工菜单等测试逻辑 await page.ClickAsync("#employee-menu"); await page.WaitForUrlAsync("**/employees"); // 验证页面是否正确加载 Assert.True(await page.IsVisibleAsync("h1:text('Employees')")); } }
内容的提问来源于stack exchange,提问作者ca53rlb
相关产品推荐
相关产品推荐

