我有一个 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.)
}
}
鉴于未提供
Startup.cs
/ TestStartup.cs
,我无法给出关于 为什么 对端点的调用返回 404
的明确答案。
既然您确实提到当您使用
Startup.cs
时端点可用,我建议您执行以下操作。
调用 .UseStartup<Startup>()
后,调用方法 ConfigureTestServices
(ms 文档在这里)。
既然你也提到了这一点:
我的 TestStartUp.cs 是一个精确的副本,仅通过模拟实现注册了很少的服务。完全不考虑改变。
您将能够使用上述方法执行相同的操作。 它可能看起来像这样:
// ...
.UseStartup<Startup>()
.ConfigureTestServices(services =>
{
services.AddTransient<IService, MockService>();
});
// ...