如何使用种子数据进行单元测试 Entity Framework
How To Unit Test Entity Framework With Seeded Data
我认为使用通过播种创建的数据测试我的 VS2015 EF Code First 项目是有意义的。在设置和拆卸以及实际测试方面,我不清楚测试项目中应该包含什么。
是否有人可以指出一个例子来说明这一点?另外,我是否认为这是测试(种子数据)的好方法?我找不到这方面的例子。我看到的例子似乎更复杂,而不是模拟数据。
您没有说明您是否使用 MSTest,但我今天刚遇到这个问题,这就是我使用 MSTest 所做的。此基础测试 class 处理运行的第一个测试的播种。 Initialize(false) 使其不会尝试在二次测试运行时进行初始化,因此只有第一次测试支付安装费用。由于每个测试都在一个事务中,他们将回滚每个测试中所做的更改。
[TestClass]
public abstract class EntityFrameworkTest
{
private static bool _hasSeeded;
protected TransactionScope Scope;
[TestInitialize]
public void Initialize()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourContext, YourModelNameSpace.Migrations.Configuration>());
using (var context = new YourContext())
{
context.Database.Initialize(false);
if (!_hasSeeded)
{
context.AnEntity.AddOrUpdate(c => c.EntityName, new AnEntity {EntityName = "Testing Entity 1"});
context.SaveChanges();
_hasSeeded = true;
}
}
Scope = new TransactionScope();
}
[TestCleanup]
public void CleanUp()
{
Scope.Dispose();
}
[AssemblyCleanup]
public static void KillDb()
{
using (var context = new YourContext())
context.Database.Delete();
}
}
还值得注意的是,我使用这样的连接字符串设置我的测试项目 app.config,我的上下文设置为查找 (ConnStringName)。这里的愿望是每台开发机器将只在其本地数据库中创建一个测试数据库,并且如果它们的实际 SQL 实例设置不同,则不必 fiddle 将连接字符串更改为某些内容。此外,根据您是否使用 VS 2015,您的本地数据库数据源可能会有所不同。
<add name="ConnStringName" connectionString="Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=DbNameTestingInstance; Integrated Security=True; MultipleActiveResultSets=True;Application Name=Testing Framework;" providerName="System.Data.SqlClient" />
我认为使用通过播种创建的数据测试我的 VS2015 EF Code First 项目是有意义的。在设置和拆卸以及实际测试方面,我不清楚测试项目中应该包含什么。
是否有人可以指出一个例子来说明这一点?另外,我是否认为这是测试(种子数据)的好方法?我找不到这方面的例子。我看到的例子似乎更复杂,而不是模拟数据。
您没有说明您是否使用 MSTest,但我今天刚遇到这个问题,这就是我使用 MSTest 所做的。此基础测试 class 处理运行的第一个测试的播种。 Initialize(false) 使其不会尝试在二次测试运行时进行初始化,因此只有第一次测试支付安装费用。由于每个测试都在一个事务中,他们将回滚每个测试中所做的更改。
[TestClass]
public abstract class EntityFrameworkTest
{
private static bool _hasSeeded;
protected TransactionScope Scope;
[TestInitialize]
public void Initialize()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourContext, YourModelNameSpace.Migrations.Configuration>());
using (var context = new YourContext())
{
context.Database.Initialize(false);
if (!_hasSeeded)
{
context.AnEntity.AddOrUpdate(c => c.EntityName, new AnEntity {EntityName = "Testing Entity 1"});
context.SaveChanges();
_hasSeeded = true;
}
}
Scope = new TransactionScope();
}
[TestCleanup]
public void CleanUp()
{
Scope.Dispose();
}
[AssemblyCleanup]
public static void KillDb()
{
using (var context = new YourContext())
context.Database.Delete();
}
}
还值得注意的是,我使用这样的连接字符串设置我的测试项目 app.config,我的上下文设置为查找 (ConnStringName)。这里的愿望是每台开发机器将只在其本地数据库中创建一个测试数据库,并且如果它们的实际 SQL 实例设置不同,则不必 fiddle 将连接字符串更改为某些内容。此外,根据您是否使用 VS 2015,您的本地数据库数据源可能会有所不同。
<add name="ConnStringName" connectionString="Data Source=(localdb)\MSSQLLocalDB; Initial Catalog=DbNameTestingInstance; Integrated Security=True; MultipleActiveResultSets=True;Application Name=Testing Framework;" providerName="System.Data.SqlClient" />