Why is TestServer not able to find controllers when controller is in separate assembly for asp.net core app?

11,539

Solution 1

Actually I found a solution for now, see diff below: enter image description here

It sounds like this may be bug of TestServer() class and how it is hosting the application during the test run.

Here is the line of code in case you cannot read above in image

.AddApplicationPart(Assembly.Load(new AssemblyName("WebApiToReproduceBug.Controllers"))); 

Solution 2

For those of you experiencing this during a migration to netcoreapp3.0, I found the above answers work, but you can do this more cleanly by changing the reference in your .csproj file itself perhaps.

In my case I changed the first XML line

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

to

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

Credits to: https://github.com/aspnet/Mvc/issues/5992#issuecomment-395408983

Solution 3

In addition to joey answer: There is no need to call Assembly.Load() to resolve this bug. You can use the code below. ServiceHookController is class from a separate project.


public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddApplicationPart(typeof(ServiceHookController).Assembly);
}

Solution 4

If you follow the pre-requisites from the MS documentation the controllers from separate assemblies are loaded.

In my case adding Microsoft.AspNetCore.Mvc.Testing NuGet package fixed the issue and I don't need to call AddApplicationPart anymore.

Share:
11,539
jb007
Author by

jb007

Software Engineer

Updated on June 15, 2022

Comments

  • jb007
    jb007 almost 2 years

    For some reason, when ASP.NET core controllers are created in separate assembly, the TestServer is not able to find controller actions when the client makes a request.(results in 404 response) Why is this? How can I work around it? Here are steps to reproduce.

    1. Create new ASP.NET Core WebAPI using .NET core
    2. Create integration tests in separate project and configure the test to use TestServer() client and get tests to work successfully.
    3. Now, separate the controller into its own shared library and refactor project created in step 1 to use this shared library instead.
    4. Re-run test which contains the TestServer() class. You'll notice now it fails.

    See the follwing link for creating the integration tests. Integration testing w/ ASP.NET Core

  • Marc Wittke
    Marc Wittke almost 7 years
    Made my day. You should also mention the related issue on Github: github.com/aspnet/Mvc/issues/5992
  • Ibrahim ULUDAG
    Ibrahim ULUDAG over 6 years
    You saved my life.
  • Stefaan
    Stefaan about 6 years
    Note that if you are registering your controllers in the container with AddControllersAsServices, the call to AddApplicationPart should happen first.
  • Karel Kral
    Karel Kral over 5 years
    You does not have to use Assembly.Load, the next snippet is working also. ServiceHookController is from assembly you want to test. services.AddMvc() .AddApplicationPart(typeof(ServiceHookController).Assembly);
  • Sam
    Sam over 5 years
    I like this slightly better. Thank you!
  • El Mac
    El Mac almost 4 years
    Buut then I get a "Program does not contain a static 'Main' method suitable for an entry point", if I change that line in my Test project.
  • daniel.caspers
    daniel.caspers almost 4 years
    I think I did this on my *.Web.Tests project but I don't remember. Seems like the kind of class of issue where Clean Solution, followed by Rebuild Solution is warranted.
  • Larry Lustig
    Larry Lustig over 3 years
    This worked for me. New 3.1 application, not a migration.
  • manymanymore
    manymanymore almost 3 years
    OMFG. I was looking for your answer for more than 2 days straight. Thank you very much!
  • resnyanskiy
    resnyanskiy almost 3 years
    Valid for net5. This should be an accepted answer.