Xunit new in memory database DBContext Class has live data
Xunit new in memory database DBContext Class has live data
我正在尝试使用 EF Core 内存数据库进行单元测试,如下所示:
namespace ContosoTests
{
public class TrendServiceTests
{
private static Microsoft.EntityFrameworkCore.DbContextOptions<TestContext> options = new
Microsoft.EntityFrameworkCore.DbContextOptionsBuilder<TestContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
private static TestContext _context = new TestContext(options);
private readonly TrendService trendService = new TrendService(_context);
private void SeedInMemoryDb()
{
if (!_context.TrendHistories.Any())
{
_context.TrendHistories.Add(new TrendHistory { IsActive = true, Quarter = E_Quarter.Q1,
TrendYear = 2020 });
}
if (!_context.Controls.Any())
{
_context.Controls.Add(new Control { IsActive = true});
_context.Controls.Add(new Control { IsActive = true});
_context.Controls.Add(new Control { IsActive = false});
}
_context.SaveChanges();
}
}
我的 TestContext 继承自我的实时上下文 class 以避免错误:
数据库提供商'Microsoft.EntityFrameworkCore.InMemory'、'Microsoft.EntityFrameworkCore.SqlServer'的服务已经在服务提供商中注册。一个服务提供者只能注册一个数据库提供者
所以我的 TestContext 看起来像:
public class TestContext : ContosoContext
{
public TestContext(DbContextOptions<TestContext> options)
{
}
public TestContext()
{
}
}
当我在测试中使用 TestContext (_context) 的新实例时 class,ContosoContext 的所有实时数据都在那里。
我期望它是一个没有数据的上下文 class 的新实例,这样我就可以用受控数据测试我的 DAL 代码。但这种情况并非如此。
我对单元测试还很陌生,所以非常感谢任何帮助。
编辑:
以下是我的 contoso 上下文的相关部分 class
public class ContosoContext: IdentityDbContext<ContosoApplicationUser>
{
public ContosoContext(DbContextOptions<ContosoContext> options) : base
(options)
{
}
public ContosoContext()
{
}
//all my DBSets here
protected override void OnConfiguring(DbContextOptionsBuilder
optionsBuilder)
{
optionsBuilder.UseSqlServer("MyConnectionString");
}
}
所以问题是我的 onconfiguring 方法直接处理连接字符串??
要修复错误,您需要删除 OnConfiguring
方法中的 optionsBuilder.UseSqlServer("MyConnectionString");
或避免注册多个数据库提供程序,将其更改为:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if(!optionsBuilder.IsConfigured)
optionsBuilder.UseSqlServer("MyConnectionString");
}
我正在尝试使用 EF Core 内存数据库进行单元测试,如下所示:
namespace ContosoTests
{
public class TrendServiceTests
{
private static Microsoft.EntityFrameworkCore.DbContextOptions<TestContext> options = new
Microsoft.EntityFrameworkCore.DbContextOptionsBuilder<TestContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
private static TestContext _context = new TestContext(options);
private readonly TrendService trendService = new TrendService(_context);
private void SeedInMemoryDb()
{
if (!_context.TrendHistories.Any())
{
_context.TrendHistories.Add(new TrendHistory { IsActive = true, Quarter = E_Quarter.Q1,
TrendYear = 2020 });
}
if (!_context.Controls.Any())
{
_context.Controls.Add(new Control { IsActive = true});
_context.Controls.Add(new Control { IsActive = true});
_context.Controls.Add(new Control { IsActive = false});
}
_context.SaveChanges();
}
}
我的 TestContext 继承自我的实时上下文 class 以避免错误:
数据库提供商'Microsoft.EntityFrameworkCore.InMemory'、'Microsoft.EntityFrameworkCore.SqlServer'的服务已经在服务提供商中注册。一个服务提供者只能注册一个数据库提供者
所以我的 TestContext 看起来像:
public class TestContext : ContosoContext
{
public TestContext(DbContextOptions<TestContext> options)
{
}
public TestContext()
{
}
}
当我在测试中使用 TestContext (_context) 的新实例时 class,ContosoContext 的所有实时数据都在那里。
我期望它是一个没有数据的上下文 class 的新实例,这样我就可以用受控数据测试我的 DAL 代码。但这种情况并非如此。
我对单元测试还很陌生,所以非常感谢任何帮助。
编辑:
以下是我的 contoso 上下文的相关部分 class
public class ContosoContext: IdentityDbContext<ContosoApplicationUser>
{
public ContosoContext(DbContextOptions<ContosoContext> options) : base
(options)
{
}
public ContosoContext()
{
}
//all my DBSets here
protected override void OnConfiguring(DbContextOptionsBuilder
optionsBuilder)
{
optionsBuilder.UseSqlServer("MyConnectionString");
}
}
所以问题是我的 onconfiguring 方法直接处理连接字符串??
要修复错误,您需要删除 OnConfiguring
方法中的 optionsBuilder.UseSqlServer("MyConnectionString");
或避免注册多个数据库提供程序,将其更改为:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if(!optionsBuilder.IsConfigured)
optionsBuilder.UseSqlServer("MyConnectionString");
}