我有一个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中是否有等价物?
如果没有这一点,我是否可以通过某种方式将测试项目的连接字符串指向应用程序数据库而不使用绝对路径?
答案 0 :(得分:0)
我的解决方案是让一个静态DbManager
类执行Setup()
,我将从数据库测试类的[ClassInitialize]
方法运行。 Setup()
将:
AppDomain.CurrentDomain.BaseDirectory
更改连接字符串(因此不再是App.config中的绝对路径)。 一些代码:
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"/>