web-dev-qa-db-ja.com

単体テストプロジェクトで定義されたスタートアップクラスを使用すると404を返す.NETCoreTestServer

基本的な.netコアAPIWebアプリと、TestServerを使用してhttpリクエストを行う単体テストプロジェクトがあります。

APIプロジェクトのStartupクラスをサブクラス化したTestStartupクラスがあります。

Startupクラスが単体テストプロジェクトにある場合、404応答が返されます。 TestStartupクラスをAPIプロジェクトに移動すると、200の応答が返されます。

Apiプロジェクト

Api.csproj

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

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>();
}

Startup.cs

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

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

TestController.cs

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

ユニットテストプロジェクト

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" />

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");
    }
}

Startup.cs

public class TestStartup : Startup
{ }
6
Dan

以下の2つのオプションを試すことができます。

  • 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
        }
    
  • 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");
        }
    
    }
    

2番目のオプションについては、 ASP.NET Coreでの統合テスト を参照できます。

2
Tao Zhou