忽略集成测试的代码优先迁移

本文关键字:迁移 代码 集成测试 | 更新日期: 2023-09-27 18:10:59

我想为我的EF code first项目编写我的第一个集成测试,使用VS2013SqlServer 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作为参数传递,它只是猜测。