未找到测试服务器 returns 404
TestServer returns 404 not found
我正在为我的 Web api 项目使用 aspnetcore 3.0 预览版 7。目前我正在实施集成测试。 (首先为了使测试更容易,我注释掉了控制器上的 Authorize 属性。)
服务器响应“404 未找到”。
我对启动中不再有 "usemvc" 感到困惑 - 我现在应该在设置测试服务器时做些不同的事情吗?
或者有人知道导致 404 的原因吗?
(用于 3.0 集成测试的 MS 文档尚未更新)。
我也试过预览 8,但同样的问题。
测试class:
[OneTimeTearDown]
public virtual void Cleanup()
{
_unAuthenticatedServer.Dispose();
}
[OneTimeSetUp]
public virtual void Initialize()
{
_unAuthenticatedServer = CreateServer(null);
}
protected TestServer CreateServer(
string currentDirectory = null)
{
IWebHostBuilder webHostBuilder = WebHost.CreateDefaultBuilder();
webHostBuilder.UseContentRoot(currentDirectory == null
? Directory.GetCurrentDirectory()
: Directory.GetCurrentDirectory() + $"\{currentDirectory}");
webHostBuilder.UseStartup<TestStartup>();
webHostBuilder.UseEnvironment("Test");
webHostBuilder.ConfigureAppConfiguration((_, config) => config.AddJsonFile("appsettings.Test.json"));
return new TestServer(webHostBuilder);
}
[Test, Order(1)]
public async Task Should_Get_Games_Return_StatusCode_Ok()
{
//Arrange
IList<GameDto> expectedDtos = GameDtoTestData.Games;
//Act
HttpResponseMessage responseMessage = await _unAuthenticatedServer
.CreateClient()
.GetAsync("api/games");
//Assert
responseMessage.StatusCode.Should().Be(HttpStatusCode.OK); // but is: 404 NotFound
var responseString = await responseMessage.Content.ReadAsStringAsync();
IEnumerable<GameDto> result = JsonConvert.DeserializeObject<IEnumerable<GameDto>>(responseString);
result.Should().BeEquivalentTo(expectedDtos);
}
控制器:
[Route("api/[controller]")]
[ApiController]
public class GamesController : ControllerBase
{
private readonly IGameService _gameService;
public GamesController(IGameService gameService)
{
_gameService = gameService;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<GameDto>>> Get()
{
return Ok(await _gameService.GetAsync());
}
}
已安装的 Nuget 包测试项目:
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="5.8.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.0.0-preview7.19365.7" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.0.0-preview7.19365.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.2.6" />
<PackageReference Include="nunit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.14.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
</ItemGroup>
已安装的 Nuget 包api 项目:
<ItemGroup>
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="3.0.0-preview6.19307.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
对我有用的是将包含 Startup class 的程序集注册为 Mvc 应用程序部分。
在您的启动 class 中,将以下代码添加到 IServiceProvider ConfigureServices(IServiceCollection services)
:
services
.AddMvc(...)
.AddApplicationPart(typeof(Startup).Assembly)
您需要将包含 Startup class 的程序集注册为 Startup class 本身中的应用程序部分,这似乎有点奇怪;但这种方法对我有用。
我正在为我的 Web api 项目使用 aspnetcore 3.0 预览版 7。目前我正在实施集成测试。 (首先为了使测试更容易,我注释掉了控制器上的 Authorize 属性。)
服务器响应“404 未找到”。 我对启动中不再有 "usemvc" 感到困惑 - 我现在应该在设置测试服务器时做些不同的事情吗? 或者有人知道导致 404 的原因吗? (用于 3.0 集成测试的 MS 文档尚未更新)。 我也试过预览 8,但同样的问题。
测试class:
[OneTimeTearDown]
public virtual void Cleanup()
{
_unAuthenticatedServer.Dispose();
}
[OneTimeSetUp]
public virtual void Initialize()
{
_unAuthenticatedServer = CreateServer(null);
}
protected TestServer CreateServer(
string currentDirectory = null)
{
IWebHostBuilder webHostBuilder = WebHost.CreateDefaultBuilder();
webHostBuilder.UseContentRoot(currentDirectory == null
? Directory.GetCurrentDirectory()
: Directory.GetCurrentDirectory() + $"\{currentDirectory}");
webHostBuilder.UseStartup<TestStartup>();
webHostBuilder.UseEnvironment("Test");
webHostBuilder.ConfigureAppConfiguration((_, config) => config.AddJsonFile("appsettings.Test.json"));
return new TestServer(webHostBuilder);
}
[Test, Order(1)]
public async Task Should_Get_Games_Return_StatusCode_Ok()
{
//Arrange
IList<GameDto> expectedDtos = GameDtoTestData.Games;
//Act
HttpResponseMessage responseMessage = await _unAuthenticatedServer
.CreateClient()
.GetAsync("api/games");
//Assert
responseMessage.StatusCode.Should().Be(HttpStatusCode.OK); // but is: 404 NotFound
var responseString = await responseMessage.Content.ReadAsStringAsync();
IEnumerable<GameDto> result = JsonConvert.DeserializeObject<IEnumerable<GameDto>>(responseString);
result.Should().BeEquivalentTo(expectedDtos);
}
控制器:
[Route("api/[controller]")]
[ApiController]
public class GamesController : ControllerBase
{
private readonly IGameService _gameService;
public GamesController(IGameService gameService)
{
_gameService = gameService;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<GameDto>>> Get()
{
return Ok(await _gameService.GetAsync());
}
}
已安装的 Nuget 包测试项目:
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="5.8.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.0.0-preview7.19365.7" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.0.0-preview7.19365.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.2.6" />
<PackageReference Include="nunit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.14.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
</ItemGroup>
已安装的 Nuget 包api 项目:
<ItemGroup>
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" Version="3.0.0-preview6.19307.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.2.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
对我有用的是将包含 Startup class 的程序集注册为 Mvc 应用程序部分。
在您的启动 class 中,将以下代码添加到 IServiceProvider ConfigureServices(IServiceCollection services)
:
services
.AddMvc(...)
.AddApplicationPart(typeof(Startup).Assembly)
您需要将包含 Startup class 的程序集注册为 Startup class 本身中的应用程序部分,这似乎有点奇怪;但这种方法对我有用。