Search code examples
c#asp.net-web-apiintegration-testingminimal-apis

Separate Program.cs to Startup.cs in ASP.NET WebAPI Minimal for Integration testing


I am trying to write integration tests for my web service.

I want to separate Program.cs into Startup.cs so test class can mock TestStartup.cs(or something like so). The point is swapping real services with mock services.

Attempt to use Startup.cs file for MinimalApi resulting app not compilable:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) {
    (...)
    // Error CS1929  'IApplicationBuilder' does not contain a definition for
    // 'MapGroup' and the best extension method overload 'EndpointRouteBuilderExtensions.MapGroup(IEndpointRouteBuilder, string)'
    // requires a receiver of type 'Microsoft.AspNetCore.Routing.IEndpointRouteBuilder'
    app.MapGroup("/product").MapProductApi().WithTags("Product");
    app.UseResponseCaching();
    app.UseOutputCache();
}

Am I going the right direction? Should Minimal Apis be used with Startup.cs?


Solution

  • You can reconfigure the services with the usual test setup (see this answer for more details):

    var application = new WebApplicationFactory<Program>()
        .WithWebHostBuilder(builder =>
        {
            builder.ConfigureServices(services =>
            {
                // set up servises
                services.RemoveAll(typeof(RegisteredServiceTypeToReplace));
                // add new registration for RegisteredServiceTypeToReplace
            });
        });
    

    As for :

    // Error CS1929 'IApplicationBuilder' does not contain a definition for 'MapGroup'...

    You can try using UseEndpoints:

    app.UseEndpoints(routeBuilder =>
    {
        routeBuilder.MapGroup(...);
        // ...
    })