C# 从Microsoft.AspNetCore.TestHost.TestServer获取连接字符串值
我有一个测试项目,我需要在测试类中获取连接字符串值C# 从Microsoft.AspNetCore.TestHost.TestServer获取连接字符串值,c#,asp.net,asp.net-core,.net-core,C#,Asp.net,Asp.net Core,.net Core,我有一个测试项目,我需要在测试类中获取连接字符串值 public class EmplyeesScenarios { private readonly TestServer _testServer; private readonly AppDbContext _testService; public EmplyeesScenarios() { _testServer = TestServerFactory.CreateServer<Test
public class EmplyeesScenarios
{
private readonly TestServer _testServer;
private readonly AppDbContext _testService;
public EmplyeesScenarios()
{
_testServer = TestServerFactory.CreateServer<TestsStartup>();
var dbOption = new DbContextOptionsBuilder<AppDbContext>()
.UseSqlServer("//here i need to put the same connection string of _testServer")
.Options;
_testService = new AppDbContext(dbOption);
}
}
公共类员工大会
{
私有只读测试服务器TestServer;
私有只读AppDbContext\u testService;
公共雇员会议()
{
_testServer=TestServerFactory.CreateServer();
var dbOption=new DbContextOptionsBuilder()
.UseSqlServer(//这里我需要放置与_testServer相同的连接字符串)
.选择;
_testService=newappdbcontext(dbOption);
}
}
您可以在测试主机上使用服务集合。例如:
var config = _testServer.Host.Services.GetRequiredService<IConfigurationRoot>();
var connectionString = config.GetConnectionString("Foo");
var config=_testServer.Host.Services.GetRequiredService();
var connectionString=config.GetConnectionString(“Foo”);
但是,您实际上应该在所有服务中使用此选项,因此,与其尝试更新您的上下文,不如执行以下操作:
var context = _testServer.Host.Services.GetRequiredService<AppDbContext>();
var context=\u testServer.Host.Services.GetRequiredService();
不需要连接字符串。假设测试服务器设置正确,您应该直接从服务器实例解析数据库上下文。像这样:
_testServer = TestServerFactory.CreateServer<TestsStartup>();
// create service scope and retrieve database context
using (var scope = _testServer.Host.Services.CreateScope())
{
var db = scope.ServiceProvider.GetService<AppDbContext>();
// ensure that the db is created for example
await db.Database.EnsureCreatedAsync();
// add test fixtures or whatever
}
\u testServer=TestServerFactory.CreateServer();
//创建服务范围并检索数据库上下文
使用(var scope=_testServer.Host.Services.CreateScope())
{
var db=scope.ServiceProvider.GetService();
//例如,确保创建了数据库
等待db.Database.EnsureCreatedAsync();
//添加测试夹具或其他东西
}
从技术上讲,您也可以从测试主机解析配置并从中读取连接字符串,但由于您正在进行集成测试,实际上,您应该通过手动创建数据库上下文来测试完全集成,而不是偏离现有设置。它说没有注册“Microsoft.Extensions.Configuration.IConfigurationRoot”类型的服务。
TestsStartup
是如何设置的?理想情况下,它应该继承SUT项目中的Startup
类,或者直接使用该Startup
类。如果您只是为了测试而创建一个完全自定义的启动
类,那么您将使所有测试无效。公共类TestsStartup:Startup========================================================================================公共测试sStartup(IConfiguration配置):基本(配置){}@ChrisPratt web主机将注册IConfiguration,非IConfigurationRoot
。