我正试图使用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>());
你需要第三种选择。使用连接字符串时要小心,不要覆盖生产数据库。