EF6 localdb用于集成测试

时间:2015-05-07 03:21:28

标签: testing entity-framework-6 localdb

我正在开发一个需要一些数据库访问的WPF应用程序。出于开发目的,我使用localdb启用了数据库迁移和EF6。

我无法弄清楚的是如何在VS2013测试项目中为集成测试配置单独的localdb数据库,并运行数据库迁移以使其更新,然后使用数据对其进行播种。

2 个答案:

答案 0 :(得分:2)

以下是基于多个来源的信息我最终做的事情。首先,在我的测试项目的App.Config中,我添加了以下内容

<connectionStrings>
    <add name="YourContextName" connectionString="Data Source=(localdb)\mssqllocaldb;Integrated Security=true;AttachDBFilename=|DataDirectory|\databasename.mdf"
   providerName="System.Data.SqlClient" />    
</connectionStrings>

然后我创建了以下类:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Data.Entity;
using MyProject.Model.Entities;
using MyProject.Migrations;

namespace IntegrationTests
{
    public class DatabaseInitializer : DropCreateDatabaseAlways<MyProjectDataContext>
    {
    }

    [TestClass]
    public class Initalize
    {
        [AssemblyInitialize]
        public static void AssemblyInit(TestContext context)
        {
            AppDomain.CurrentDomain.SetData("DataDirectory", context.TestDeploymentDir);
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyProjectDataContext, Configuration>());

            //Database.SetInitializer(new DatabaseInitializer());
    }
}

}

我的理解是这在每次测试运行之前运行。 SetData调用更新| DataDirectory |在App.Config中使用,以便它是唯一的,并且不会尝试使用与普通项目相同的实例。

从那里我可以选择运行迁移,然后在测试过程中提供一些测试数据,或运行设置测试数据的初始化程序。请注意,要运行迁移,必须将迁移生成的配置类从内部更改为公共。

到目前为止这似乎有效。不确定这是否是最佳方式,或者我是否可以组合迁移,然后为测试运行不同的种子。

答案 1 :(得分:0)

在您的测试项目中,您可以使用databaseInitializer或您自己调用Database.SetInitializer()的{​​{1}}设置项目配置文件中的IDatabaseInitializer(或MigrateDatabaseToLatestVersion) },并使用自定义DbMigrator.Update

测试项目可以使用单独的连接字符串来使用LocalDB,如果连接字符串引用的文件是DbMigrationsConfiguration,则初始化程序将尝试创建它。