如何使用 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>());
你需要第三个选项。请注意您的连接字符串,不要覆盖您的生产数据库。
我正在尝试使用 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>());
你需要第三个选项。请注意您的连接字符串,不要覆盖您的生产数据库。