簡體   English   中英

測試服務器返回 404 not found

[英]TestServer returns 404 not found

我正在為我的 web api 項目使用 aspnetcore 3.0 preview 7。 目前我正在實施集成測試。 (首先為了使測試更容易,我注釋掉了控制器上的 Authorize 屬性。)

服務器響應“404 not found”。 我對啟動中不再有“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>

對我有用的是將包含 Startup 類的程序集注冊為 Mvc 應用程序部件。

在您的啟動類中,修改IServiceProvider ConfigureServices(IServiceCollection services)使其包含以下代碼:

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

您需要將包含 Startup 類的程序集注冊為 Startup 類本身中的應用程序部分,這似乎有點奇怪; 但這種方法確實對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM