如何使用种子数据对单元测试实体框架进行单元测试

时间:2015-11-11 15:58:05

标签: entity-framework ef-code-first

我认为使用种子创建的数据测试我的VS2015 EF Code First项目是有意义的。在设置和拆卸以及实际测试方面,我不清楚测试项目应该是什么。

有没有一个例子可以指出我的情节?另外,我认为这是一种测试的好方法(种子数据)。我一直无法找到这方面的例子。我看到的例子似乎与模拟数据相比要复杂得多。

1 个答案:

答案 0 :(得分:1)

您还没有指定是否使用MSTest,但我今天遇到了这个问题,这就是我使用MSTest所做的。此基本测试类处理第一个运行的测试的种子。 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实例设置不同,就不必改变连接字符串。此外,根据您是否是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" />