AspNetCore.TestHost中的路由取决于Startup.cs位置?

时间:2017-11-09 15:56:15

标签: c# .net asp.net-core integration-testing asp.net-core-testhost

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

0 个答案:

没有答案