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