我正在尝试使用Microsoft.AspNetCore.TestHost测试我的ASP.NET核心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类在哪里,我都希望所有路由都能正常工作。可以以某种方式解决吗?