gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:17:37 25 4
gpt4 key购买 nike

我正在尝试为我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com