首页 > 解决方案 > .NET Core TestServer 在使用单元测试项目中定义的 Startup 类时返回 404

问题描述

我有一个基本的 .net core api web 应用程序和一个使用 TestServer 发出 http 请求的单元测试项目。

我有一个 TestStartup 类,它继承了 api 项目中的 Startup 类。

如果 Startup 类在单元测试项目中,我会收到 404 响应。如果将 TestStartup 类移至 api 项目,我会收到 200 个响应。

Api 项目

api.csproj

<PackageReference Include="Microsoft.AspNetCore.App" />

程序.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

启动.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvcCore();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }
}

测试控制器.cs

public class TestController : ControllerBase
{
    [HttpGet("test")]
    public ObjectResult Get()
    {
        return Ok("data");
    }
}

单元测试项目

测试.csproj

<PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="2.1.2" />
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
<PackageReference Include="NUnit" Version="3.10.1" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />

测试.cs

[TestFixture]
public class Tests
{
    [Test]
    public async Task Test()
    {
        var server = new TestServer(WebHost.CreateDefaultBuilder()
            .UseStartup<TestStartup>()
            .UseEnvironment("Development"));

        var response = await server.CreateClient().GetAsync("test");
    }
}

启动.cs

public class TestStartup : Startup
{ }

标签: unit-testingasp.net-coreintegration-testingasp.net-core-2.1

解决方案


如果有人遇到这种针对 ASP.NET Core 3.03.1的问题,请不要忘记将测试项目 SDK 更改为Microsoft.NET.Sdk.Web,即

<Project Sdk="Microsoft.NET.Sdk.Web">

根据测试应用程序先决条件


推荐阅读