单元测试实体框架将连接字符串设置为bin目录而不是App_Data

时间:2014-06-19 06:30:38

标签: c# asp.net-mvc entity-framework unit-testing connection-string

我正在尝试使用实体框架运行单元测试。

当我使用debug或release运行时,我设置了我的连接字符串,如下所示:

#if RELEASE
        public DataContext()
            : base("Release")
        {
        }
#else
        public DataContext()
            : base("Debug")
        {
        }
#endif

我在Web.Config中的连接字符串如下所示:

 <connectionStrings>
    <add name="Debug" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\mydatabase.mdf;Initial Catalog=mydatabase;Integrated Security=True" providerName="System.Data.SqlClient" />
    <add name="Release" connectionString="MultipleActiveResultSets=true;Net=dbmssocn;Server=my.site.com;Database=mydatabase;User ID=myuser;Password=mypass;" providerName="System.Data.SqlClient" />
  </connectionStrings>

当我只运行我的Asp.Net MVC网站时,这非常有用。

但是当我去运行单元测试时,它会在bin目录中查找,而不是在我的App_Data目录中使用Debug连接字符串和调试数据库,即使项目是在运行测试之前针对Debug配置构建的。 / p>

我得到的错误是:

  

System.Data.Entity.Core.EntityException:底层提供程序在Open上失败。 ---&GT; System.Data.SqlClient.SqlException:无法附加   文件   &#39; d:\发展\项目\ myproject的\ MyProject的\ BIN \ mydatabase.mdf

为什么它在bin目录中查找而不是使用连接字符串中定义的App_Data路径?

解答:

答案是在我的基础测试类的测试夹具设置中设置App Domain中的数据目录:

public class TestBase
{
    [TestFixtureSetUp]
    public void Setup()
    {
        var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
        var appDataDirectory = Path.Combine(baseDirectory.Replace("\\bin", ""), "App_Data");

        AppDomain.CurrentDomain.SetData("DataDirectory", appDataDirectory);
    }
}

1 个答案:

答案 0 :(得分:1)

对于单元测试项目,DataDirectory未自动设置。尝试自己手动设置:

var appDataDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../App_Data");

AppDomain.CurrentDomain.SetData("DataDirectory", appDataDir);

确保在初始化EF上下文之前调用上面的代码。