无法对.NET 8集成项目使用自定义启动

问题描述 投票:0回答:1

我有一个 ASP.NET Core Web API 项目,我已经对其进行了升级,现在正在 .NET 8 上运行。

我计划将集成测试包含在 xUnit 的项目中。

现在,由于我在早期版本中总是有一个startup.cs,所以我坚持保持相同方法的计划。

我想使用

TestStartup.cs
类进行集成测试来管理和注入所有外部依赖项作为模拟。

问题是当我使用

TestStartup.cs
作为启动并测试我的控制器时,我得到端点 404。

当我指向实际的

Startup.cs
时,效果很好。

Startup.cs
TestStartup.cs
都有相同的代码,仅模拟依赖注入不同。

这就是我的

program.cs
的样子

public static void Main(string[] args)
{
    MyHost.Start<Startup>(args);
}

public static class MyHost
{
    public static void Start<TStartup>(string[] args, ....) where TStartup: class
    {
        CreateWebHostBuilder<TStartup>(args ,......)
            .Build().Run();
    }

    private static IWebHostBuilder CreateWebHostBuilder(string[] args, ...) where TStartup : 
  class => {
        WebHost.CreateDefaultBuilder(args)
               .UseStartup<TStartup>()
               .ConfigureLogging(....)
               .ConfigureAppConfiguration(...);
    }
}

这就是我的

Startup
的样子:

public class Startup
{
    public void ConfigureService(IserviceCollection services)
    {
        // ....
    }

    public void Configure(IApplicationBuidler app, IWebHostEnvironment env)
    {
        // ....
    }
}

我的

TestStartUp.cs
是一个精确的副本,只有很少的服务是通过模拟实现注册的。完全不考虑改变。

这就是我进行测试的

customWebApplicationFactory
设置的方式。

public class CustomApplicationFactory: WebApplicationFactory<TestStartup> // When I replace it with Startup this works
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost.VreateDefaultBuilder()
                      .UseStartup<TestStartUp>() // When I replace it with Startup this works
                      .ConfigureLogging()
                      .ConfigureAppConfiguration();
    }
}

最后,这是我的测试

public class MyTest
{
    private readonly HttpClient _client;
    private readonly CustomApplicationFactory _factory;

    public MyTest()
    {
        _client = _factory.CreateClient()
    }

    [Fact]
    public async Task MyTestMethod()
    {
        // code for preparing/sending request using _client and some assertion 
        // which works perfectly fine when pointed to Startup.cs but when 
        // pointed to TestStartup.cs gives my 404(the controller method has no 
       // hit.)
    }
}
c# integration-testing .net-8.0 app-startup
1个回答
0
投票

鉴于未提供

Startup.cs
/
TestStartup.cs
,我无法给出关于 为什么 对端点的调用返回
404
的明确答案。

既然您确实提到当您使用

Startup.cs
时端点可用,我建议您执行以下操作。 调用
.UseStartup<Startup>()
后,调用方法
ConfigureTestServices
ms 文档在这里)。

既然你也提到了这一点:

我的 TestStartUp.cs 是一个精确的副本,仅通过模拟实现注册了很少的服务。完全不考虑改变。

您将能够使用上述方法执行相同的操作。 它可能看起来像这样:

// ...
.UseStartup<Startup>()
.ConfigureTestServices(services =>
{
    services.AddTransient<IService, MockService>();
});
// ...
© www.soinside.com 2019 - 2024. All rights reserved.