gpt4 book ai didi

c# - .NET Core 的 NUnit Entity Framework 集成测试依赖注入(inject)问题

转载 作者:太空狗 更新时间:2023-10-29 23:12:27 28 4
gpt4 key购买 nike

我刚刚开始使用 Entity Framework 研究 .NET Core。我之前曾将 .NET Framework 与 Ninject 结合使用,但我现在正在尝试使用 .NET Core 中内置的 DI。

我有一个 TestBase 类,我的测试将从中派生。我希望此类负责使用 [OneTimeSetUp][OneTimeTearDown] 创建和删除测试数据库。问题是我似乎无法弄清楚如何在设置和拆卸方法中访问我的 DI 服务。这些方法不能有参数,我的 TestBase 类必须有一个无参数的构造函数,所以我也无法从那里获取它们。

[SetUpFixture]
public partial class TestBase
{
protected IEFDatabaseContext DataContext { get; set; }

public TestBase(IEFDatabaseContext dataContext)
{
this.DataContext = dataContext;
}

[OneTimeSetUp]
public void TestInitialise()
{
this.DataContext.Database.EnsureCreated();
}

[OneTimeTearDown]
public void TestTearDown()
{
this.DataContext.Database.EnsureDeleted();
}
}

上面给出了以下错误:

TestBase does not have a default constructor.

我很可能会以错误的方式解决这个问题,但这是我过去一直做事的方式,所以请让我知道在使用 .NET Core DI 时是否有更好的方法。


Startup 引用类:

public class Startup
{
private readonly IConfiguration config;

public Startup(IConfiguration config)
{
this.config = config;
}

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TestDataContext>(
options => options.UseSqlServer(this.config.GetConnectionString("TestConnectionString")),
ServiceLifetime.Singleton);

services.AddScoped<IEFDatabaseContext>(provider => provider.GetService<TestDataContext>());
}
}

最佳答案

感谢 NightOwl 为我指明了正确的方向。 Microsoft article on integration testing 的组合可能的重复问题让我想到了以下解决方案。

通过使用 TestServer来自 Microsoft.AspNetCore.TestHost我能够访问 DI ServiceProvider内置 Startup .

测试库:

public partial class TestBase
{
protected readonly TestServer server;
protected readonly IEFDatabaseContext DataContext;

public TestBase()
{
this.server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
this.DataContext = this.server.Host.Services.GetService<IEFDatabaseContext>();
}

[OneTimeSetUp]
public void TestInitialise()
{
this.DataContext.Database.EnsureCreated();
}

[OneTimeTearDown]
public void TestTearDown()
{
this.DataContext.Database.EnsureDeleted();
}
}

启动:

public class Startup
{
private readonly IConfiguration config;

public Startup(IConfiguration config)
{
this.config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

}

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TestDataContext>(
options => options.UseSqlServer(this.config.GetConnectionString("TestConnectionString")),
ServiceLifetime.Singleton);

services.AddScoped<IEFDatabaseContext>(provider => provider.GetService<TestDataContext>());
}
}

关于c# - .NET Core 的 NUnit Entity Framework 集成测试依赖注入(inject)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49351023/

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