使用EF为每个测试使用单独的数据库进行单元测试

时间:2013-01-25 09:46:41

标签: c# entity-framework ef-code-first sql-server-ce multiple-databases

使用Fluent NHibernate进行单元测试时,我为每个测试创建一个新会话,该会话有自己的工厂,创建一个sqlite数据库,其中文件名等于完全限定的testname(来自TestContext)。这总是给我一个干净的数据库,并没有与并行运行的单元测试冲突。我将这些数据库存储在ramdrive上,因此我具有与内存数据库相同的速度,但之后也可以看到结果数据。

首先使用EF Code和SQL Ce可以实现这一点吗? 我希望这个问题的解决方案也可以让我使用EF和两个数据库,一个基于文件的本地数据库用于离线访问,同步到基于云的数据库。

1 个答案:

答案 0 :(得分:0)

我找到了实现这个目标的方法:

public class Db : DbContext {
    private static SqlCeConnectionFactory factory = 
               new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");

    public static Db Create(string filename) {
        return new Db(factory.CreateConnection(@"Data Source=" + filename));
    }

    public Db(DbConnection conn)
        : base(conn, true) {
    }

    public DbSet<object> TableName {get; set;}
}

在单元测试代码中,我可以使用:

private Db CreateDb() {
    return Db.Create("R:\\"+TestContext.FullyQualifiedTestClassName + 
                     TestContext.TestName + ".sdf");
}

[TestMethod]
public void StoreAndRetrieve() {
    using (var db = CreateDb()) {
        ...
    }
}