TestServer 返回 404 未找到

Posted

技术标签:

【中文标题】TestServer 返回 404 未找到【英文标题】:TestServer returns 404 not found 【发布时间】:2019-08-15 04:12:12 【问题描述】:

我正在为我的 web api 项目使用 aspnetcore 3.0 preview 7。目前我正在实施集成测试。 (首先为了让测试更容易,我注释掉了控制器上的 Authorize 属性。)

服务器响应“404 未找到”。 我对启动时不再有“usemvc”感到困惑——我现在应该在设置测试服务器时做些不同的事情吗? 或者有人知道导致404的原因吗? (使用 3.0 进行集成测试的 MS 文档尚未更新)。 我也试过预览 8,但同样的问题。

测试类:

   [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>

【问题讨论】:

这能回答你的问题吗? Why is TestServer not able to find controllers when controller is in separate assembly for asp.net core app? 【参考方案1】:

对我有用的是将包含 Startup 类的程序集注册为 Mvc 应用程序部件。

在你的启动类中,将以下代码添加到IServiceProvider ConfigureServices(IServiceCollection services)

services
  .AddMvc(...)
  .AddApplicationPart(typeof(Startup).Assembly)

您需要将包含 Startup 类的程序集注册为 Startup 类本身的应用程序部件,这似乎有点奇怪;但这种方法确实对我有用。

【讨论】:

这对我有用,谢谢!希望微软将来会让这个解决方法过时:-) 我发现这个答案也有相同的结果,但在我的情况下,在 .NET Core 2.2 到 3.0 的迁移***.com/a/58946016/2831961 哇。这是救命稻草。在偶然发现这个之前,我挠了挠头一整天。 哇!那行得通。无法想象你是怎么想出来的,但非常感谢!! 谢谢先生!你救了我! :D

以上是关于TestServer 返回 404 未找到的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot /actuator 返回 404 未找到

Django - DRF 删除/检索/补丁返回 404 详细信息:“未找到”

Azure Web 应用返回 404(未找到)

Paypal Refund Sale REST API 返回:远程服务器返回错误:(404)未找到

为啥 Spring Boot 中的 REST 控制器返回 HTTP 状态 404 – 未找到

WebRequest.GetResponse - 远程服务器返回错误:(404)未找到