gpt4 book ai didi

c# - 针对 Entity Framework InMemory 进行测试

转载 作者:太空宇宙 更新时间:2023-11-03 22:45:57 27 4
gpt4 key购买 nike

我目前正在使用内存数据库 测试 Entity Framework DbContext

为了使测试尽可能原子化,每个测试方法的 DbContext 都是唯一的,并且填充了每个测试所需的初始数据。

为了设置 DbContext 的初始状态,我创建了一个 void SetupData 方法,用我将在测试中使用的一些实体填充上下文。

这种方法的问题是测试无法访问在设置期间创建的对象,因为 Entity Framework 将自己分配 ID,这些 ID 在运行时之前是未知的。

为了克服这个问题,我认为我的 SetupData 方法可以变成这样:

public Fixture SetupData(MyContext context) 
{
var fixture = new Fixture();
fixture.CreatedUser = new User();
context.Users.Add(fixture.CreatedUser);
context.SaveChanges();

return fixture;
}

public class Fixture
{
public User CreatedUser { get; set;}
}

如您所见,它返回了一个我称之为“Fixture” 的实例。 (不知道这个名字适不适合)

这样,SetupData 将返回一个对象(Fixture)引用实体。因此,测试可以使用创建的对象。否则,将无法识别对象,因为在调用 SaveChanges 之前不会创建 Id。

我的问题是:

  • 这是一种不好的做法吗?
  • 有没有更好的方法来引用初始值数据?

最佳答案

我更喜欢这种方法:

public void SetupData(MyContext context) 
{
var user = new User() { Id = Fixture.TEST_USER1_ID, UserName = Fixture.TEST_USER1_NAME };
context.Users.Add(user);
context.SaveChanges();
}

public class Fixture
{
public const int TEST_USER1_ID = 123;
public const string TEST_USER!_NAME = "testuser";
}

您的方法可能也不错,但您可能想知道测试中某处的用户 ID,这使得在单个已知位置指定它变得非常容易,这样它就不会改变,例如您稍后更改您的测试数据和添加用户的顺序。

关于c# - 针对 Entity Framework InMemory 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49925892/

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