如何使用Entity Framework Code First V6.1.2进行集成测试



我正试图使用EF代码前6.1.2为我的数据库访问逻辑添加一些集成测试。我想在一个单独的数据库上做这件事,这样我就不会把生产数据库和测试数据搞得一团糟。

此外,测试应该是可重复的,这意味着如果数据库不存在,就应该创建数据库,种子测试数据,运行测试,最后在完成后删除它。

对于测试数据库,如果没有Enable-Migrations命令,我也看不出如何做到这一点。

这将是我用于生产的dbContext

public partial class ApplicationDbContext : 
        IdentityDbContext<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IApplicationDbContext
{
    public ApplicationDbContext() : base("name=DefaultConnection") { }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (base.Database.Connection.ConnectionString == "DefaultConnectionTest")
            Database.SetInitializer(new DropCreateDatabaseAlways<ApplicationDbContext>());
        else
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ApplicationUser>().ToTable("Users");
        modelBuilder.Entity<ApplicationRole>().ToTable("Roles");
        modelBuilder.Entity<ApplicationUserRole>().ToTable("UserRoles");
        modelBuilder.Entity<ApplicationUserLogin>().ToTable("UserLogins");
        modelBuilder.Entity<ApplicationUserClaim>().ToTable("UserClaims");
    }
    public DbSet<Order> Orders { get; set; }
    public DbSet<Product> Products { get; set; }
    public DbSet<Person> Persons { get; set; }
}

我使用Ninject中的Dependency Injection设置了所有内容。添加一个带有连接字符串作为参数public ApplicationDbContext(string dbConnection) : base(dbConnection) { }的额外构造函数,仍然需要运行Enable-Migrations命令。

有没有办法使这个过程自动化?或者有人能提出其他建议吗?

我想坚持使用SQL Server数据库,因为使用不同的数据库进行测试可能会给我带来误报。

您必须使用数据库初始化程序。有几个可用:

Database.SetInitializer(new CreateDatabaseIfNotExists<InterstoneContext>());
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<InterstoneContext>());
Database.SetInitializer(new DropCreateDatabaseAlways<InterstoneContext>());

你需要第三种选择。使用连接字符串时要小心,不要覆盖生产数据库。

最新更新