忽略集成测试的代码优先迁移
本文关键字:迁移 代码 集成测试 | 更新日期: 2023-09-27 18:10:59
我想为我的EF code first
项目编写我的第一个集成测试,使用VS2013
和SqlServer CE
,在我的测试项目中定义以下TestInitialize
方法,删除旧的测试DB并在每次测试运行时重新创建一个新的DB:
[TestInitialize]
public void SetupTest()
{
// file path of the database to create
var filePath = @"C:'code'TestingEf'TestTemp'RealMyAppDb.sdf";
// delete it if it already exists
if (File.Exists(filePath))
File.Delete(filePath);
// create the SQL CE connection string - this just points to the file path
string connectionString = "Datasource = " + filePath;
// NEED TO SET THIS TO MAKE DATABASE CREATION WORK WITH SQL CE!!!
Database.DefaultConnectionFactory =
new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
using (var context = new IASCoDbContext(connectionString,new DropCreateDatabaseAlways<IASCoDbContext>()))
{
// this will create the database with the schema from the Entity Model
try
{
context.Database.Create();
}
catch
{
}
}
// initialise our DbContext class with the SQL CE connection string,
// ready for our tests to use it.
}
但是当代码到达context.Database.Create();
行时,我得到以下错误:
(更新){"指定的表不存在。(表)"}我调试了测试,发现这是因为程序要运行
Migrations
UP()
方法。
下面的代码包含了我的IADCoDbContext
的构造函数:
public class IASCoDbContext : BaseDbContext
{
static IASCoDbContext()
{
Database.SetInitializer<IASCoDbContext>(null);
}
public IASCoDbContext(string connectionString)
: base("name=ERPContext")
{
}
public IASCoDbContext(string connectionString, IDatabaseInitializer<IASCoDbContext> initializer)
:base(connectionString)
{
Database.SetInitializer(initializer);
}
...
}
这是我的BaseDbContext
:
public class BaseDbContext : DbContext
{
public BaseDbContext()
: base()
{
}
public BaseDbContext(string context)
: base(context)
{
}
}
我是否可以禁用Code First Migration
用于集成测试?
通常迁移是由数据库初始化器执行的,可以通过将DbContext的初始化器设置为null来禁用。
Database.SetInitializer<TestContext>(null);
如果不知道IASCoDbContext构造函数中的代码,我只能猜测发生了什么,但作为
DropCreateDatabaseAlways<IASCoDbContext>()
也是一个数据库初始化器它的作用是
public virtual void InitializeDatabase(TContext context)
{
Check.NotNull<TContext>(context, "context");
context.Database.Delete();
context.Database.Create(DatabaseExistenceState.DoesNotExist);
this.Seed(context);
context.SaveChanges();
}
我假设这个initializeddatabase方法是在你的上下文的构造函数中调用的。所以我认为
context.Database.Create();
方法调用是多余的。
但是正如我所说的,不知道在Context构造函数中发生了什么,DatabaseInitializer作为参数传递,它只是猜测。