我想知道在使用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的成功也是成功的。我不确定那个单元测试这种模式的目的是什么。
答案 0 :(得分:1)
由于你在嘲笑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());