gpt4 book ai didi

c# - 网络核心 : Override WebApplicationFactory Services DbContext with InMemory Database

转载 作者:太空宇宙 更新时间:2023-11-03 22:31:34 24 4
gpt4 key购买 nike

我正在自定义 WebApplicationFactory 以使用原始应用程序项目中的 Startup、appsettings。

目的是创建指向原始应用程序启动的集成测试。 dbcontext 的 appsettings json 如下:

  "ConnectionStrings": {
"DbConnection": "Data Source=.;Initial Catalog = TestDB; Integrated Security=True"

我想覆盖服务以使用内存数据库,从下面的变量。我将如何执行此操作?

自定义 Web 应用程序工厂:

namespace Integrationtest
{
public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureAppConfiguration((hostingContext, configurationBuilder) =>
{
var type = typeof(TStartup);
var path = @"C:\OriginalApplication";

configurationBuilder.AddJsonFile($"{path}\\appsettings.json", optional: true, reloadOnChange: true);
configurationBuilder.AddEnvironmentVariables();
});
}
}
}

实际集成测试:

public class DepartmentAppServiceTest : IClassFixture<CustomWebApplicationFactory<OriginalApplication.Startup>>

{
public dbContextTest context;
public CustomWebApplicationFactory<OriginalApplication.Startup> _factory;
public DepartmentAppServiceTest(CustomWebApplicationFactory<OriginalApplication.Startup> factory)
{
_factory = factory;
}

[Fact]
public async Task DepartmentAppTest()
{
using (var scope = _factory.Server.Host.Services.CreateScope())
{
context.Department.Add(new Department { DepartmentId = 2, DepartmentCode = "123", DepartmentName = "ABC" });
context.SaveChanges();

var foo = scope.ServiceProvider.GetRequiredService<IDepartmentAppService>();
var departmentDto = await foo.GetDepartmentById(2);
Assert.Equal("123", departmentDto.DepartmentCode);
}
}
}

我想从下面的这个变量覆盖服务数据库以使用内存数据库。我将如何执行此操作?

           var dbtest = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();

var options = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(databaseName: "TestDB")
.Options;

最佳答案

您可以使用 WebHostBuilder.ConfigureTestServices 调整集成测试服务器使用的服务配置。这样,您可以重新配置数据库上下文以使用不同的配置。这也包含在 integration testing chapter 中。的文档。

protected override void ConfigureWebHost(IWebHostBuilder builder)
{
// …

builder.ConfigureTestServices(services =>
{
// remove the existing context configuration
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<ApplicationDbContext>));
if (descriptor != null)
services.Remove(descriptor);

services.AddDbContext<ApplicationDbContext>(options =>
options.UseInMemoryDatabase("TestDB"));
});
}

传递给ConfigureTestServices的配置将始终在 Startup.ConfigureServices 之后 运行,因此您可以使用它来覆盖集成测试的真实服务。

对于大多数情况,只需在现有注册上注册一些其他类型就足以使其适用于所有地方。除非您实际检索单一类型的多个服务(通过在某处注入(inject) IEnumerable<T>),否则这不会产生负面影响。

关于c# - 网络核心 : Override WebApplicationFactory Services DbContext with InMemory Database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com