使用单元测试项目中定义的启动类时,.NET Core TestServer返回404

Dan*_*Dan 5 integration-testing unit-testing asp.net-core asp.net-core-2.1

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

我有一个TestStartup类,该类将api项目中的Startup类子类化。

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

Api项目

蜜蜂

<PackageReference Include="Microsoft.AspNetCore.App" />
Run Code Online (Sandbox Code Playgroud)

Program.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>();
}
Run Code Online (Sandbox Code Playgroud)

启动文件

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

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }
}
Run Code Online (Sandbox Code Playgroud)

TestController.cs

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

单元测试项目

Tests.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" />
Run Code Online (Sandbox Code Playgroud)

Tests.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");
    }
}
Run Code Online (Sandbox Code Playgroud)

启动文件

public class TestStartup : Startup
{ }
Run Code Online (Sandbox Code Playgroud)

Zab*_*sky 44

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

<Project Sdk="Microsoft.NET.Sdk.Web">
Run Code Online (Sandbox Code Playgroud)

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


Tao*_*hou 8

您可以尝试以下两种选择:

  • 添加AddApplicationPartStartup.cs

    namespace IntegrationTestMVC
    {
    public class Startup
    {         
    
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {   
           services.AddMvc().AddApplicationPart(Assembly.Load(new AssemblyName("IntegrationTestMVC"))); //"IntegrationTestMVC" is your original project name
        }
    
    Run Code Online (Sandbox Code Playgroud)
  • 尝试转换TestFixtureIClassFixture

        public class IntegrationTestMVCUnitTest : IClassFixture<WebApplicationFactory<TestStartup>>
    {
        private readonly HttpClient _client;
        private readonly WebApplicationFactory<TestStartup> _factory;
    
        public IntegrationTestMVCUnitTest(WebApplicationFactory<TestStartup> factory)
        {
    
            _factory = factory;
            _client = factory.CreateClient();
        }
    
        [Fact]
        public async Task IndexRendersCorrectTitle()
        {
            var response = await _client.GetAsync(@"/test");
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

对于第二个选项,您可以参考ASP.NET Core中的集成测试。

  • `services.AddMvc().AddApplicationPart(typeof(Startup).Assembly)` (2认同)

Mat*_*hew 6

Microsoft.AspNetCore.Mvc.Testing按照aspnetcore-2.2#test-app-prerequisities中的说明添加对包含测试的项目文件的引用解决了我的问题。