我正在尝试使用 Microsoft.AspNetCore.TestHost 测试我的 ASP.NET Core Web 应用程序。它以这种方式工作正常(结果状态为 200):
var server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
var client = server.CreateClient();
var result = await client.GetAsync(someRequestUrl);
在这种情况下,将使用 API 项目中真正的 Startup 类。
但是,我不想在集成测试中使用真正的 Startup 类。主要原因是需要模拟一些在应用程序启动期间连接的东西。例如,要使用的数据库服务器。它可以通过在 Startup.cs 中定义一个虚拟方法以非常优雅的方式完成:
public virtual void SetupDbContext(IServiceCollection services)
{
services.AddDbContext<TbsDb>(options =>
options.UseSqlServer("someConnectionString"));
}
然后我创建一个新类,它继承自原始的 Startup 类并覆盖此方法以使用 Sqlite、内存数据库或其他任何东西:
public override void SetupDbContext(IServiceCollection services)
{
services.AddDbContext<TbsDb>(
options => options.UseSqlite("someConnectionString"));
}
如果新类在同一个 API 项目中,这也适用于 TestHost。
显然,我不希望用于测试的此类存在。但是如果我将它移动到集成测试项目并在那里创建一个 TestServer,同样的测试会失败,因为结果的状态为 404。为什么会发生这种情况?它仍然继承自 API 项目中的 Startup 类。因此,无论 TestStartup 类在哪里,我都希望所有路由都能正常工作。它可以以某种方式解决吗?