gpt4 book ai didi

c# - 模拟 EF 上下文时的关系检查

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:50 25 4
gpt4 key购买 nike

我想知道在使用 Moq 对 EF 上的存储库进行单元测试时是否有任何方法可以模拟外键检查?我有以下代码,在技术上应该会失败,因为其中一个关系不存在于数据库或上下文中的模拟集中。

var entitySet = new Mock<DbSet<MyEntity>>();
var mockContext = new Mock<MyContext>();
mockContext.Setup(x => x.Set<MyEntity>()).Returns(entitySet.Object);
var myentity = new MyEntity
{
RefID = "ABCD", //Foreign Key that does not exist in the context
};

var repo = new MyRepo<MyEntity>(mockContext.Object);
repo.Add(myentity);

//repo.Add()
public void Add(TEntity entity)
{
DbSet.Add(entity);
context.SaveChanges();
}

我预计此代码会失败,因为具有引用 ID 的对象不存在但它会成功并且我添加到 mockContext 的任何验证也会成功。我不确定单元测试此模式的目的是什么。

最佳答案

由于您正在模拟 DbSet,因此您需要告诉它您希望发生异常。

换句话说,模拟的 DbSet 将表现得很好(因为您正在使用 loose 模拟),就好像一切都很好;模拟的 DbSet 没有外键约束的概念——更不用说您的域的特定约束了——因为它不是真正的 DbSet,因此永远不会发生错误.

要告诉模拟集你想要在 Add 上出现异常,你需要像这样设置 entitySet:

var myentity = new MyEntity
{
RefID = "ABCD", //Foreign Key that does not exist in the context
};
entitySet.Setup(p => p.Add(myentity))
.Throws(new YourForeignKeyConstraintException());

要让您的 SaveChanges 方法抛出,只需添加此行而不是上面的行:

mockContext.Setup(p => p.SaveChanges())
.Throws(new YourForeignKeyConstraintException());

关于c# - 模拟 EF 上下文时的关系检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26243048/

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