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

How to do integration test using 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 服务器数据库,因为使用不同的数据库进行测试可能会出现误报。

您必须使用数据库初始化程序。有一些可用的:

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

你需要第三个选项。请注意您的连接字符串,不要覆盖您的生产数据库。