.NET Core TestServer returning 404 when using Startup class defined in unit test project












0














I've a basic .net core api web app and a unit test project that uses a TestServer to make http requests.



I've a TestStartup class that subclassed the Startup class in the api project.



If the Startup class is in the unit test project i get a 404 response.
If the TestStartup class is moved to the api project i get a 200 reponse.



Api Project



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


Unit Test Project



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
{ }









share|improve this question






















  • I have just asked this question: stackoverflow.com/questions/53681935/… (before seeing yours). Did you find an answer? Could you answer my question? Thanks
    – w0051977
    Dec 8 at 15:00
















0














I've a basic .net core api web app and a unit test project that uses a TestServer to make http requests.



I've a TestStartup class that subclassed the Startup class in the api project.



If the Startup class is in the unit test project i get a 404 response.
If the TestStartup class is moved to the api project i get a 200 reponse.



Api Project



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


Unit Test Project



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
{ }









share|improve this question






















  • I have just asked this question: stackoverflow.com/questions/53681935/… (before seeing yours). Did you find an answer? Could you answer my question? Thanks
    – w0051977
    Dec 8 at 15:00














0












0








0


0





I've a basic .net core api web app and a unit test project that uses a TestServer to make http requests.



I've a TestStartup class that subclassed the Startup class in the api project.



If the Startup class is in the unit test project i get a 404 response.
If the TestStartup class is moved to the api project i get a 200 reponse.



Api Project



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


Unit Test Project



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
{ }









share|improve this question













I've a basic .net core api web app and a unit test project that uses a TestServer to make http requests.



I've a TestStartup class that subclassed the Startup class in the api project.



If the Startup class is in the unit test project i get a 404 response.
If the TestStartup class is moved to the api project i get a 200 reponse.



Api Project



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


Unit Test Project



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
{ }






unit-testing asp.net-core integration-testing asp.net-core-2.1






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 22 at 21:33









Dan

649




649












  • I have just asked this question: stackoverflow.com/questions/53681935/… (before seeing yours). Did you find an answer? Could you answer my question? Thanks
    – w0051977
    Dec 8 at 15:00


















  • I have just asked this question: stackoverflow.com/questions/53681935/… (before seeing yours). Did you find an answer? Could you answer my question? Thanks
    – w0051977
    Dec 8 at 15:00
















I have just asked this question: stackoverflow.com/questions/53681935/… (before seeing yours). Did you find an answer? Could you answer my question? Thanks
– w0051977
Dec 8 at 15:00




I have just asked this question: stackoverflow.com/questions/53681935/… (before seeing yours). Did you find an answer? Could you answer my question? Thanks
– w0051977
Dec 8 at 15:00












1 Answer
1






active

oldest

votes


















0














You could try two options below:





  • Add AddApplicationPart to Startup.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
    }



  • Try to convert TestFixture to IClassFixture



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

    }



For the second option, you could refer Integration tests in ASP.NET Core






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438200%2fnet-core-testserver-returning-404-when-using-startup-class-defined-in-unit-test%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    You could try two options below:





    • Add AddApplicationPart to Startup.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
      }



    • Try to convert TestFixture to IClassFixture



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

      }



    For the second option, you could refer Integration tests in ASP.NET Core






    share|improve this answer


























      0














      You could try two options below:





      • Add AddApplicationPart to Startup.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
        }



      • Try to convert TestFixture to IClassFixture



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

        }



      For the second option, you could refer Integration tests in ASP.NET Core






      share|improve this answer
























        0












        0








        0






        You could try two options below:





        • Add AddApplicationPart to Startup.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
          }



        • Try to convert TestFixture to IClassFixture



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

          }



        For the second option, you could refer Integration tests in ASP.NET Core






        share|improve this answer












        You could try two options below:





        • Add AddApplicationPart to Startup.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
          }



        • Try to convert TestFixture to IClassFixture



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

          }



        For the second option, you could refer Integration tests in ASP.NET Core







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 26 at 6:25









        Tao Zhou

        4,73621128




        4,73621128






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53438200%2fnet-core-testserver-returning-404-when-using-startup-class-defined-in-unit-test%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

            Calculate evaluation metrics using cross_val_predict sklearn

            Insert data from modal to MySQL (multiple modal on website)