[英]NUnit Entity Framework integration test dependency injection issue with .NET Core
我刚刚开始研究带有实体框架的.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
没有默认的构造函数。
我可能会以错误的方式进行操作,但这是我过去一直做的事情,因此,请让我知道使用.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 文章和可能存在的重复问题,我找到了以下解决方案。
通过使用Microsoft.AspNetCore.TestHost
的TestServer
,我可以访问Startup
内置的DI ServiceProvider
。
测试库:
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>());
}
}
集成测试ASP.NET Core已在Microsoft文档中很好地介绍了。
基本上,您需要从NuGet Microsoft.AspNetCore.TestHost
安装Test Host项目,然后使用它在NUnit中启动Web环境。
public class TestClass
{
private TestServer _server;
private HttpClient _client;
[OneTimeSetUp]
public void SetUp()
{
// Arrange
_server = new TestServer(new WebHostBuilder()
.UseStartup<Startup>());
_client = _server.CreateClient();
}
[OneTimeTearDown]
public void TearDown()
{
_server = null;
_client = null;
}
[Test]
public async Task ReturnHelloWorld()
{
// Act
var response = await _client.GetAsync("/");
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
// Assert
Assert.Equal("Hello World!",
responseString);
}
}
使用TestServer
可以干预DI配置和/或IConfiguration
来替代配置中的伪造品。 在集成测试ASP.NET Core Web API和EF Core时,请参阅重新配置依赖项 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.