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

标签 c# sql-server entity-framework ef-code-first integration-testing

我正在尝试使用 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>());

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

关于c# - 如何使用 Entity Framework Code First V6.1.2 进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28515643/

相关文章:

sql-server - 在 SQL Server 2000 中按字段按非字母顺序排序

c# - 找不到源类型 'System.Data.Entity.DbSet' 的查询模式的实现

c# - 无法跟踪实体类型 'BookLoan' 的实例

c# - 使用 iTextSharp 获取包含在指定区域中的文本事件

c# - Ploeh AutoFixture 无法从 System.Runtime.Serialization.ExtensionDataObject 创建实例

c# - 如何解析字符串以匹配 C# 中的模式

json - 如何在 mssql 中更新 JSON 中的嵌套数组

sql-server - Sql Server 字符串到日期的转换

c# - 单元测试 IHttpModule 的最佳实践

c# - 使用 Linq,从列表中获取另一个 List<int> 中的所有项目