我正在开发一个需要一些数据库访问的WPF应用程序。出于开发目的,我使用localdb启用了数据库迁移和EF6。
我无法弄清楚的是如何在VS2013测试项目中为集成测试配置单独的localdb数据库,并运行数据库迁移以使其更新,然后使用数据对其进行播种。
答案 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
,则初始化程序将尝试创建它。