从Microsoft.AspNetCore.TestHost.TestServer获取连接字符串值

时间:2018-06-25 14:45:20

标签: c# asp.net asp.net-core .net-core

我有一个测试项目,我需要在测试类中获取连接字符串值

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);

    }
}

2 个答案:

答案 0 :(得分:0)

您可以在测试主机上使用服务集合。例如:

var config = _testServer.Host.Services.GetRequiredService<IConfigurationRoot>();
var connectionString = config.GetConnectionString("Foo");

但是,您实际上应该将其用于 all 您的服务,因此,不要尝试完全更新您的上下文,而要做:

var context = _testServer.Host.Services.GetRequiredService<AppDbContext>();

不需要连接字符串。

答案 1 :(得分:0)

假设您的测试服务器设置正确,则应该直接从服务器实例解析数据库上下文。像这样:

_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
}

从技术上讲,您还可以从测试主机中解析配置,并从中读取连接字符串,但是由于您正在执行集成测试,因此您实际上应该测试完整的集成而不偏离从现有设置中手动创建数据库上下文。