C# UnitTest找不到终结点

C# UnitTest找不到终结点,c#,unit-testing,xunit.net,C#,Unit Testing,Xunit.net,使用xUnit 2.4.1测试Api总是无法找到控制器 当我创建一个WebApplicationFactory并将启动文件作为参数传递时,来自WebApplicationFactory.createvlient()的HTTP客户机总是为Get请求返回404 测试使用MVC的.Net核心Api CommonContext是设置连接的内部类 Configfile读取正确 数据库的连接字符串正确 端点调用不正确,因此不会命中控制器 继承WebApplocationFactory的类 公共类WebApi

使用xUnit 2.4.1测试Api总是无法找到控制器

当我创建一个
WebApplicationFactory
并将启动文件作为参数传递时,来自
WebApplicationFactory.createvlient()
的HTTP客户机总是为Get请求返回404

测试使用MVC的.Net核心Api

CommonContext
是设置连接的内部类

Configfile
读取正确
数据库的
连接字符串
正确
端点调用不正确,因此不会命中控制器

继承WebApplocationFactory的类

<代码>公共类WebApiTestFactory :WebApplicationFactory,其中TStartup:class { 受保护的覆盖IWebHostBuilder CreateWebHostBuilder() { var builder=new ConfigurationBuilder() .AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true) .AddenEnvironmentVariables(); var configValues=新字典 { {“运行状态”,“测试”}, }; builder.AddInMemoryCollection(配置值); 返回WebHost.CreateDefaultBuilder() .UseConfiguration(builder.Build()) .useURL(“http://localhost:53976/") .UseSetting(“applicationUrl”http://localhost:53976/") .UseStartup(); } } 单元测试

公共类TestControllerTest:IClassFixture
{
私有只读WebApiTestFactory\u工厂;
公共测试控制器测试(WebApiTestFactory工厂)
{
_工厂=工厂;
}
[理论]
[InlineData(“api/Test/GetExample”)]
公共异步任务创建(字符串url)
{
//安排
var clientOptions=新的WebApplicationFactoryClientOptions();
clientOptions.BaseAddress=新Uri(“http://localhost:53976");
var client=_factory.CreateClient(clientOptions);
//表演
var response=wait client.GetAsync(url);
//断言
response.ensureccessStatusCode();//状态代码200-299
Assert.Equal(“text/html;charset=utf-8”,
response.Content.Headers.ContentType.ToString());
}
}
控制器正在进行im测试

[ApiController]
[路线(“api/测试”)]
公共类测试控制器:控制器
{
[HttpGet(“GetExample”)]
公共操作结果GetExample()
{
返回Ok();
}
}
启动

公共类启动
{
公共启动(IConfiguration配置,IHostingEnvironment环境)
{
HostingEnvironment=env;
配置=配置;
EwBootstrapper.bootstrappelswewareservices();
}
公共IConfiguration配置{get;}
公共IHostingEnvironment主机环境{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
if(配置[“运行状态”]!=“测试”)
{
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddMvc();
services.AddScoped(=>
新的CommonContext(Configuration.GetConnectionString(“DbConnection”));
services.addswagger文档();
服务
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)//配置身份验证(JWT承载)
.AddJwtBearer(jwtOpt=>//配置JWT承载
{
jwtOpt.TokenValidationParameters=AuthenticationTokens.GetValidationParameters();
});
}
其他的
{
//services.AddMvcCore().AddJsonFormatters();
services.AddScoped(=>
新的CommonContext(Configuration.GetConnectionString(“DbTestConnection”));
}
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共void配置(IApplicationBuilder应用程序)
{
if(配置[“运行状态”]!=“测试”)
{
app.UseSwaggerDocumentation();
app.UseSwagger();
app.UseSwaggerUI(c=>
{
c、 SwaggerEndpoint(“/swagger/v1/swagger.json”,“API”);
});
app.UseMiddleware();
app.UseMvc(builder=>builder.MapRoute(“默认”,“api/{controller}/{action=Get}/{id?}”);//控制器或操作没有默认值
app.UseDefaultFiles();//启用默认文档(“/”=>“/index.html”)
app.UseStaticFiles();//wwwroot下的静态文件
app.UseAuthentication();
}
if(HostingEnvironment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
}
}

根据控制器中的属性路由,操作方法具有url
api/Test/GetExample
[HttpGet(“GetExample”)]
,但在in测试中,您正在测试
CreateExample

[InlineData("api/Test/CreateExample")]
所以我猜,你的测试返回404是正确的。该路由根本无法解析为任何现有的操作方法。
我建议您将理论更改为
[InlineData(“api/Test/GetExample”)]

您正在发出一个GET请求(
client.GetAsync(url)
),而控制器在该端点只有一个POST(
[HttpPost(“GetExample”)]
)[HttpPost(“GetExample”)]POST和GET(以名称?)我更改为HttpGet,同样的问题仍然存在