【问题标题】:How to create and connect to a test database with Entity Framework如何使用实体框架创建并连接到测试数据库
【发布时间】:2014-05-17 11:31:39
【问题描述】:

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

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

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

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

有什么方法可以让迁移在测试项目中创建另一个数据库(使用不同的种子方法)?

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

如果这一切都失败了,有什么方法可以在不使用绝对路径的情况下将测试项目的连接字符串指向应用程序数据库?

【问题讨论】:

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


    【解决方案1】:

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

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

    一些代码:

    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"/> 
    

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多