如何使用Entity Framework创建和连接到测试数据库

时间:2014-05-13 16:27:52

标签: entity-framework integration-testing ef-migrations

我有一个Web API项目访问其App_Data文件夹中的数据库文件。使用EF迁移创建数据库。

我有一些集成测试来确认数据结构和查询。他们只是创建一个Web API控制器并使用它来执行查询。 My Test Project有一个App.config文件,该文件当前对* .mdf数据库文件(在web api项目中)有一个绝对路径

这是一个问题,因为a)我正在对应用程序数据库进行测试,并且b)我的App.config文件中有一个绝对路径。

我想在测试项目中创建一个测试数据库。

我是否可以通过某种方式让Migrations在Test Project中创建另一个数据库(使用不同的Seed方法)?

在Web Api项目的Web.config连接字符串中,我们使用|DataDirectory|来指定数据库的位置。在测试项目的App.config中是否有等价物?

如果没有这一点,我是否可以通过某种方式将测试项目的连接字符串指向应用程序数据库而不使用绝对路径?

1 个答案:

答案 0 :(得分:0)

我的解决方案是让一个静态DbManager类执行Setup(),我将从数据库测试类的[ClassInitialize]方法运行。 Setup()将:

  1. 根据当前AppDomain.CurrentDomain.BaseDirectory更改连接字符串(因此不再是App.config中的绝对路径)。
  2. 使用App.config中的其他AppSetting来确定要使用的数据库,要使用的测试数据集,以及是否删除并重新创建数据库。
  3. 一些代码:

    public static class DbManager
    {
        private static string ErrorMsg { get; set; }
        private static ApplicationDbContext _db;
        private static readonly Random Rdm = new Random();
    
        public static void SetupDb()
        {
            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    
            bool refreshDb = Convert.ToBoolean(ConfigurationManager.AppSettings["RefreshDbInTestClassInitialization"]);
            string dataSet = ConfigurationManager.AppSettings["DataSetToAddForEachTestClass"];
            string dbName = ConfigurationManager.AppSettings["testDatabaseName"];
    
            var connectionStr = config.ConnectionStrings
                .ConnectionStrings["DefaultConnection"].ConnectionString
                .Replace("{dbPath}", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, (dbName + ".mdf")))
                .Replace("{dbName}", dbName);
    
            config.AppSettings.SectionInformation.ForceSave = true;
            config.ConnectionStrings.ConnectionStrings["DefaultConnection"].ConnectionString = connectionStr;
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("connectionStrings");
    
            if (refreshDb)
            {
                Database.Delete(connectionStr);
                AddDataSet(dataSet, true);
            }
        }
    
        // AddDataSet() creates a DbContext object and generates test data.
    
    }
    

    因此App.config中的连接字符串如下所示:

    connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename={dbPath};Initial Catalog={dbName};Integrated Security=True"
    

    然后App.config AppSettings部分有这些额外的键值对:

    <add key ="RefreshDbInTestClassInitialization" value ="true"/>
    <add key="DataSetToAddForEachTestClass" value="Large"/>  <!--Possible values: Large, Small-->
    <add key="testDatabaseName" value="testDb"/>