entity-framework - 在每个单元测试之前重新创建和重新设置 LocalDb

标签 entity-framework unit-testing ef-code-first asp.net-web-api localdb

我正在尝试为我的 ASP.NET Web API 项目编写单元/集成测试,并努力单独运行每个测试。请允许我解释一下。

我有一个配置了部署设置的 *.testsettings 文件。在每次测试运行之前,都会将一个空的 *.mdf 文件部署到测试位置。由于我使用的是 Entity Framework Code First,因此我可以使用数据库初始值设定项将我的架构推送到数据库并为特定表设置 2 行种子。这很好用。

我面临的问题是,如果我的所有 ApiControllers 操作的执行顺序错误,它们的各种测试可能会相互影响。例如,如果我在 POST 测试之前运行 GET 测试,则 GET 返回 2 个对象,如果它们以相反的顺序运行,则 GET 返回 3 个对象。

我认为我需要做的是在每次测试之前删除、重新创建和重新设置我的数据库。这是一个好主意还是有更好的方法?如果这是我能做的最好的事情,我会在每次测试之前重置我的数据库。

最佳答案

这是我最终为感兴趣的人所做的事情。

我延长了 DropCreateDatabaseAlways<TContext>并覆盖 Seed 方法,用我的单元测试可以依赖的已知测试数据填充我的数据库。

public class MyDatabaseInitializer : System.Data.Entity.DropCreateDatabaseAlways<MyDbContext>
{
    protected override void Seed(MyDbContext context)
    {
        // Add entities to database.

        context.SaveChanges();
    }
}

然后我实现了一个 [AssemblyInitialize]设置数据库初始值设定项的方法。
[TestClass]
public class Global
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext context)
    {
        System.Data.Entity.Database.SetInitializer(new MyDatabaseInitializer());
    }
}

这为数据库设置了初始化程序,但实际上并没有运行它。初始化程序在 [TestInitialize] 中运行我编写的方法强制在每次测试之前删除、重新创建和重新播种数据库。
[TestClass]
public class MyTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
        MyDbContext context = new MyDbContext();
        context.Database.Initialize(true);
    }

    [TestMethod]
    public void MyUnitTest()
    {
        Assert.IsTrue(true);
    }
}

关于entity-framework - 在每个单元测试之前重新创建和重新设置 LocalDb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13732532/

相关文章:

sql-server - 如何在运行时在 DatabaseGeneeratedOption.Identity、Compulated 和 None 之间切换,而不必生成空的 DbMigrations

c# - 处理 : both fields equal or both null or empty 的 linq 函数

unit-testing - 单元测试失败消息的推荐标准?

c# - Code First 选择数据 - 相关实体始终返回 null

PHP:如何开始测试大型现有代码库并测试生产站点的回归?

java - 尽管有DirtiesContext.ClassMode.BEFORE_CLASS,SpringBootTest中的MockBean仍取决于执行顺序

c# - EF 代码首先排除列

linq - 在linq联接中使用等于和不等于

c# - 如何使用 include in 子查询进行左外连接?

entity-framework - 扩展 Entity Framework 模型